Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 366|回复: 0

[默认分类] 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-24 14:03:50 | 显示全部楼层 |阅读模式
    索引
    【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
    简述
    前两天事情比较多,耽误更新了,希望大家多多包涵,今天我们继续做我们的登录功能
    项目准备
    我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
    希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。
    项目开始
    一、Spring容器的配置注入
    前一篇,我们新建了几个Xml配置文件,并且我们创建了用户接口和实现类,今天,首先呢,我们来注入Service,我们之前在Service类库下面新建了个文件夹Config并且添加了两个嵌入资源ComService.xml和Service.xml。
    我们之前讲过,Com呢表示我们一些通用的东西,就像我们的通用类库叫Common,这只是个人的命名习惯,并非MVC要求我们。因为我们创建的用户表是管理员表,所以我把这个配置放到Service.xml里,我们来修改一下Service.xml

      
      
    代码:



      
    1. 1 <?xml version="1.0" encoding="utf-8" ?>
    2. 2 <objects xmlns="http://www.springframework.net">
    3. 3   <description>Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量</description>
    4. 4   <!--系统管理begin-->
    5. 5   <!--用户管理-->
    6. 6   <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">
    7. 7   </object>
    8. 8   <!--系统管理end-->
    9. 9 </objects>
    复制代码

      
    View Code

      
    二、Log4net
    我们在此插入一段,了解一下log4net记录日志,这个后面我们很多地方都要用到。
    log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。大部分的日志记录都是记录到文件,我们主要记录到数据库,这比较有利于我们的管理员查看日志事件。
    1、安装log4net
    安装方式一:http://logging.apache.org/log4net/
    安装方式二(推荐):通过NuGet安装log4net  命令:Install-Package log4net



      
    2、在项目的程序集信息描述文件中,设置Log4net的可记录属性


    1. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
    复制代码


      
    3、在程序根目录添加log4net的配置文件 log4net.config

      
      
    我把配置代码贴给大家:



      
    1.   1 <?xml version="1.0" encoding="utf-8"?>
    2.   2 <configuration>
    3.   3   <configSections>
    4.   4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    5.   5   </configSections>
    6.   6   <log4net>
    7.   7     <root>
    8.   8       <level value="ALL"/>
    9.   9     </root>
    10. 10     <logger name="dblog" additivity="false">
    11. 11       <level value="ALL"/>
    12. 12       <appender-ref ref="SqlServerAppender" />
    13. 13     </logger>
    14. 14     <!--Oracle数据库-->
    15. 15     <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
    16. 16       <!-- Oracle数据源-->
    17. 17       <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    18. 18       <!-- Oracle连接字符串-->
    19. 19       <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
    20. 20       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
    21. 21       <!--  
    22. 22              设置缓存区大小  
    23. 23              1表明有一条日志就要写入  
    24. 24              如果10就表示日志到达10条时一起写入  
    25. 25              -->
    26. 26       <bufferSize value="0"/>
    27. 27       <parameter>
    28. 28         <parameterName value=":Dates" />
    29. 29         <dbType value="DateTime" />
    30. 30         <layout type="log4net.Layout.RawTimeStampLayout"/>
    31. 31       </parameter>
    32. 32       <parameter>
    33. 33         <parameterName value=":Levels" />
    34. 34         <dbType value="String" />
    35. 35         <size value="50" />
    36. 36         <layout type="log4net.Layout.PatternLayout">
    37. 37           <conversionPattern value="%level" />
    38. 38         </layout>
    39. 39       </parameter>
    40. 40       <parameter>
    41. 41         <parameterName value=":Logger" />
    42. 42         <dbType value="String" />
    43. 43         <size value="200" />
    44. 44         <layout type="log4net.Layout.PatternLayout">
    45. 45           <conversionPattern value="%logger" />
    46. 46         </layout>
    47. 47       </parameter>
    48. 48       <parameter>
    49. 49         <parameterName value=":Message" />
    50. 50         <dbType value="String" />
    51. 51         <size value="4000" />
    52. 52         <layout type="log4net.Layout.PatternLayout">
    53. 53           <conversionPattern value="%message" />
    54. 54         </layout>
    55. 55       </parameter>
    56. 56       <parameter>
    57. 57         <parameterName value=":Exception" />
    58. 58         <dbType value="String" />
    59. 59         <size value="4000" />
    60. 60         <layout type="log4net.Layout.PatternLayout">
    61. 61           <conversionPattern value="%exception" />
    62. 62         </layout>
    63. 63       </parameter>
    64. 64       <!--DIY-->
    65. 65       <parameter>
    66. 66         <parameterName value=":ClientUser" />
    67. 67         <dbType value="String" />
    68. 68         <size value="100" />
    69. 69         <layout type="log4net.Layout.PatternLayout">
    70. 70           <conversionPattern value="%property{ClientUser}" />
    71. 71         </layout>
    72. 72       </parameter>
    73. 73       <parameter>
    74. 74         <parameterName value=":ClientIP" />
    75. 75         <dbType value="String" />
    76. 76         <size value="20" />
    77. 77         <layout type="log4net.Layout.PatternLayout">
    78. 78           <conversionPattern value="%property{ClientIP}" />
    79. 79         </layout>
    80. 80       </parameter>
    81. 81       <parameter>
    82. 82         <parameterName value=":RequestUrl" />
    83. 83         <dbType value="String" />
    84. 84         <size value="500" />
    85. 85         <layout type="log4net.Layout.PatternLayout">
    86. 86           <conversionPattern value="%property{RequestUrl}" />
    87. 87         </layout>
    88. 88       </parameter>
    89. 89       <parameter>
    90. 90         <parameterName value=":Action" />
    91. 91         <dbType value="String" />
    92. 92         <size value="20" />
    93. 93         <layout type="log4net.Layout.PatternLayout">
    94. 94           <conversionPattern value="%property{Action}" />
    95. 95         </layout>
    96. 96       </parameter>
    97. 97     </appender>
    98. 98     <!--Sqlite数据库-->
    99. 99     <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
    100. 100       <bufferSize value="0" />
    101. 101       <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    102. 102       <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
    103. 103       <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
    104. 104       <parameter>
    105. 105         <parameterName value="@Date" />
    106. 106         <dbType value="DateTime" />
    107. 107         <layout type="log4net.Layout.RawTimeStampLayout" />
    108. 108       </parameter>
    109. 109       <parameter>
    110. 110         <parameterName value="@Level" />
    111. 111         <dbType value="String" />
    112. 112         <layout type="log4net.Layout.PatternLayout">
    113. 113           <conversionPattern value="%level" />
    114. 114         </layout>
    115. 115       </parameter>
    116. 116       <parameter>
    117. 117         <parameterName value="@Logger" />
    118. 118         <dbType value="String" />
    119. 119         <layout type="log4net.Layout.PatternLayout">
    120. 120           <conversionPattern value="%logger" />
    121. 121         </layout>
    122. 122       </parameter>
    123. 123       <parameter>
    124. 124         <parameterName value="@ClientUser" />
    125. 125         <dbType value="String" />
    126. 126         <layout type="log4net.Layout.PatternLayout">
    127. 127           <conversionPattern value="%property{ClientUser}" />
    128. 128         </layout>
    129. 129       </parameter>
    130. 130       <parameter>
    131. 131         <parameterName value="@ClientIP" />
    132. 132         <dbType value="String" />
    133. 133         <layout type="log4net.Layout.PatternLayout">
    134. 134           <conversionPattern value="%property{ClientIP}" />
    135. 135         </layout>
    136. 136       </parameter>
    137. 137       <parameter>
    138. 138         <parameterName value="@RequestUrl" />
    139. 139         <dbType value="String" />
    140. 140         <layout type="log4net.Layout.PatternLayout">
    141. 141           <conversionPattern value="%property{RequestUrl}" />
    142. 142         </layout>
    143. 143       </parameter>
    144. 144       <parameter>
    145. 145         <parameterName value="@Action" />
    146. 146         <dbType value="String" />
    147. 147         <layout type="log4net.Layout.PatternLayout">
    148. 148           <conversionPattern value="%property{Action}" />
    149. 149         </layout>
    150. 150       </parameter>
    151. 151       <parameter>
    152. 152         <parameterName value="@Message" />
    153. 153         <dbType value="String" />
    154. 154         <layout type="log4net.Layout.PatternLayout">
    155. 155           <conversionPattern value="%message" />
    156. 156         </layout>
    157. 157       </parameter>
    158. 158       <parameter>
    159. 159         <parameterName value="@Exception" />
    160. 160         <dbType value="String" />
    161. 161         <layout type="log4net.Layout.PatternLayout">
    162. 162           <conversionPattern value="%exception" />
    163. 163         </layout>
    164. 164       </parameter>
    165. 165     </appender>
    166. 166     <!--SqlServer数据库-->
    167. 167     <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">
    168. 168       <!-- SqlServer数据源-->
    169. 169       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    170. 170       <!-- SqlServer连接字符串-->
    171. 171       <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />
    172. 172       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>
    173. 173       <!--  
    174. 174              设置缓存区大小  
    175. 175              1表明有一条日志就要写入  
    176. 176              如果10就表示日志到达10条时一起写入  
    177. 177              -->
    178. 178       <bufferSize value="0"/>
    179. 179       <parameter>
    180. 180         <parameterName value="@Dates" />
    181. 181         <dbType value="DateTime" />
    182. 182         <layout type="log4net.Layout.RawTimeStampLayout" />
    183. 183       </parameter>
    184. 184       <parameter>
    185. 185         <parameterName value="@Levels" />
    186. 186         <dbType value="String" />
    187. 187         <size value="50" />
    188. 188         <layout type="log4net.Layout.PatternLayout">
    189. 189           <conversionPattern value="%level" />
    190. 190         </layout>
    191. 191       </parameter>
    192. 192       <parameter>
    193. 193         <parameterName value="@Logger" />
    194. 194         <dbType value="String" />
    195. 195         <size value="255" />
    196. 196         <layout type="log4net.Layout.PatternLayout">
    197. 197           <conversionPattern value="%logger" />
    198. 198         </layout>
    199. 199       </parameter>
    200. 200       <parameter>
    201. 201         <parameterName value="@Message" />
    202. 202         <dbType value="String" />
    203. 203         <size value="4000" />
    204. 204         <layout type="log4net.Layout.PatternLayout">
    205. 205           <conversionPattern value="%message" />
    206. 206         </layout>
    207. 207       </parameter>
    208. 208       <parameter>
    209. 209         <parameterName value="@Exception" />
    210. 210         <dbType value="String" />
    211. 211         <size value="2000" />
    212. 212         <layout type="log4net.Layout.ExceptionLayout" />
    213. 213       </parameter>
    214. 214       <!--DIY-->
    215. 215       <parameter>
    216. 216         <parameterName value="@ClientUser" />
    217. 217         <dbType value="String" />
    218. 218         <size value="100" />
    219. 219         <layout type="log4net.Layout.PatternLayout" >
    220. 220           <param name="ConversionPattern" value="%property{ClientUser}"/>
    221. 221         </layout>
    222. 222       </parameter>
    223. 223       <parameter>
    224. 224         <parameterName value="@ClientIP" />
    225. 225         <dbType value="String" />
    226. 226         <size value="100" />
    227. 227         <layout type="log4net.Layout.PatternLayout" >
    228. 228           <param name="ConversionPattern" value="%property{ClientIP}"/>
    229. 229         </layout>
    230. 230       </parameter>
    231. 231       <parameter>
    232. 232         <parameterName value="@RequestUrl" />
    233. 233         <dbType value="String" />
    234. 234         <size value="500" />
    235. 235         <layout type="log4net.Layout.PatternLayout" >
    236. 236           <param name="ConversionPattern" value="%property{RequestUrl}"/>
    237. 237         </layout>
    238. 238       </parameter>
    239. 239       <parameter>
    240. 240         <parameterName value="@Action" />
    241. 241         <dbType value="String" />
    242. 242         <size value="100" />
    243. 243         <layout type="log4net.Layout.PatternLayout" >
    244. 244           <param name="ConversionPattern" value="%property{Action}"/>
    245. 245         </layout>
    246. 246       </parameter>
    247. 247     </appender>
    248. 248     <!--记录到文件-->
    249. 249     <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
    250. 250       <param name="File" value="datalog" />
    251. 251       <param name="AppendToFile" value="true" />
    252. 252       <param name="RollingStyle" value="Date" />
    253. 253       <param name="DatePattern" value="\\yyyy\\MM-dd-HH\\&quot;SQL_&quot;yyyy-MM-dd&quot;.log&quot;" />
    254. 254       <param name="StaticLogFileName" value="false" />
    255. 255       <layout type="log4net.Layout.PatternLayout,log4net">
    256. 256         <param name="ConversionPattern" value="%d - %m%n" />
    257. 257         <param name="Header" value="&#xD;&#xA;----------------------begin--------------------------&#xD;&#xA;" />
    258. 258         <param name="Footer" value="&#xD;&#xA;----------------------end--------------------------&#xD;&#xA;" />
    259. 259       </layout>
    260. 260     </appender>
    261. 261   </log4net>
    262. 262   <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->
    263. 263   <startup>
    264. 264     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    265. 265   </startup>
    266. 266 </configuration>
    267. 267 <!--
    268. 268    调用实例
    269. 269    log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
    270. 270    log.Info(Message);
    271. 271   
    272. 272     %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
    273. 273
    274. 274     %n(new line):换行
    275. 275
    276. 276     %d(datetime):输出当前语句运行的时刻
    277. 277
    278. 278     %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
    279. 279
    280. 280     %t(thread id):当前语句所在的线程ID
    281. 281
    282. 282     %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
    283. 283
    284. 284     %c(class):当前日志对象的名称
    285. 285     
    286. 286     %L:输出语句所在的行号
    287. 287
    288. 288     %F:输出语句所在的文件名
    289. 289
    290. 290     %-数字:表示该项的最小长度,如果不够,则用空格填充
    291. 291
    292. 292     例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
    293. 293
    294. 294     176 [main] INFO  org.foo.Bar - Located nearest gas station.
    295. 295     -->
    复制代码

      
    View Code

      
    4、上面的代码中,我们配置日志记录到了数据库的日志表 SYS_LOG

    我们在数据库中新建这个日志表:
      
      


      数据库名:wkmvc_db
      

      表名:SYS_LOG
      

       
      
      
       
       
         
          
          
            
             
             序号
             列名
             数据类型
             长度
             小数位
             标识
             主键
             外键
             允许空
             默认值
             说明
             
             
             1
             ID
             int
             4
             0
             是
             是
               
             否
               
             主键ID
             
             
             2
             DATES
             datetime
             8
             3
               
               
               
             是
               
             创建时间
             
             
             3
             LEVELS
             nvarchar
             20
             0
               
               
               
             是
               
             日志等级
             
             
             4
             LOGGER
             nvarchar
             200
             0
               
               
               
             是
               
             日志调用
             
             
             5
             CLIENTUSER
             nvarchar
             100
             0
               
               
               
             是
               
             使用用户
             
             
             6
             CLIENTIP
             nvarchar
             20
             0
               
               
               
             是
               
             访问IP
             
             
             7
             REQUESTURL
             nvarchar
             500
             0
               
               
               
             是
               
             访问来源
             
             
             8
             ACTION
             nvarchar
             20
             0
               
               
               
             是
               
             操作动作
             
             
             9
             MESSAGE
             nvarchar
             4000
             0
               
               
               
             是
               
             消息
             
             
             10
             EXCEPTION
             nvarchar
             4000
             0
               
               
               
             是
               
             异常消息
             
            
            
         
       
       
       
      

    T-SQL:



      
    1. 1 USE [wkmvc_db]
    2. 2 GO
    3. 3 /****** Object:  Table [dbo].[SYS_LOG]    Script Date: 2016/5/16 9:06:19 ******/
    4. 4 SET ANSI_NULLS ON
    5. 5 GO
    6. 6 SET QUOTED_IDENTIFIER ON
    7. 7 GO
    8. 8 CREATE TABLE [dbo].[SYS_LOG](
    9. 9     [ID] [int] IDENTITY(1,1) NOT NULL,
    10. 10     [DATES] [datetime] NULL,
    11. 11     [LEVELS] [nvarchar](20) NULL,
    12. 12     [LOGGER] [nvarchar](200) NULL,
    13. 13     [CLIENTUSER] [nvarchar](100) NULL,
    14. 14     [CLIENTIP] [nvarchar](20) NULL,
    15. 15     [REQUESTURL] [nvarchar](500) NULL,
    16. 16     [ACTION] [nvarchar](20) NULL,
    17. 17     [MESSAGE] [nvarchar](4000) NULL,
    18. 18     [EXCEPTION] [nvarchar](4000) NULL,
    19. 19  CONSTRAINT [PK_SYS_LOG] PRIMARY KEY CLUSTERED
    20. 20 (
    21. 21     [ID] ASC
    22. 22 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    23. 23 ) ON [PRIMARY]
    24. 24
    25. 25 GO
    26. 26 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"主键ID" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"ID"
    27. 27 GO
    28. 28 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"创建时间" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"DATES"
    29. 29 GO
    30. 30 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"日志等级" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"LEVELS"
    31. 31 GO
    32. 32 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"日志调用" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"LOGGER"
    33. 33 GO
    34. 34 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"使用用户" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"CLIENTUSER"
    35. 35 GO
    36. 36 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"访问IP" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"CLIENTIP"
    37. 37 GO
    38. 38 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"访问来源" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"REQUESTURL"
    39. 39 GO
    40. 40 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"操作动作" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"ACTION"
    41. 41 GO
    42. 42 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"消息" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"MESSAGE"
    43. 43 GO
    44. 44 EXEC sys.sp_addextendedproperty @name=N"MS_Description", @value=N"异常消息" , @level0type=N"SCHEMA",@level0name=N"dbo", @level1type=N"TABLE",@level1name=N"SYS_LOG", @level2type=N"COLUMN",@level2name=N"EXCEPTION"
    45. 45 GO
    复制代码

      
    View Code

      
    三、新建用户登录控制器 AccountController
    在/Areas/SysManage/Controllers 下新建AccountController控制器

      
    个人习惯,我们分块控制器的代码,便于收缩、管理 用#region #endregion,#region是c#预处理器指令,是一个分块预处理命令,它主要用于编辑代码的分段,在编译时会被自动删除。

      
      
    先贴一下这个代码:



      
    1. 1 using System;
    2. 2 using System.Collections.Generic;
    3. 3 using System.Linq;
    4. 4 using System.Web;
    5. 5 using System.Web.Mvc;
    6. 6
    7. 7 namespace WebPage.Areas.SysManage.Controllers
    8. 8 {
    9. 9     public class AccountController : Controller
    10. 10     {
    11. 11         #region 声明容器
    12. 12         #endregion
    13. 13
    14. 14         #region 基本视图
    15. 15         public ActionResult Index()
    16. 16         {
    17. 17             return View();
    18. 18         }
    19. 19         #endregion
    20. 20
    21. 21         #region 帮助方法
    22. 22         #endregion
    23. 23     }
    24. 24 }
    复制代码

      
    View Code

      
    我们上一篇,在Config文件夹下面建立了三个xml文件,并且在Web.Config里面配置了指向,我们在Controllers.xml里配置一下接口的指向

      
      
    代码:



      
    1. 1 <?xml version="1.0" encoding="utf-8" ?>
    2. 2 <objects xmlns="http://www.springframework.net">
    3. 3   <description>Spring注入控制器,容器指向Service层封装的接口</description>
    4. 4   <!--系统管理 Begin-->
    5. 5   <!--登录控制器-->
    6. 6   <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false">
    7. 7     <property name="UserManage" ref="Service.User"/>
    8. 8   </object>
    9. 9   <!--系统管理 end-->
    10. 10 </objects>
    复制代码

      
    View Code

      
    OK,我们再回到我们的AccountController
    我们添加一下解决方案的引用

      
    我们在声明容器里声明一下UserManage

      
    我们在基本视图里,为Index添加一个视图:(这里面没有验证,大家不要急,我们后面慢慢修改这个页面,我们先实现基本功能)



      
    1. 1 @model Domain.SYS_USER
    2. 2 <!DOCTYPE html>
    3. 3 <html>
    4. 4 <head>
    5. 5     <meta charset="utf-8">
    6. 6     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    7. 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. 8     <title>后台登录</title>
    9. 9 </head>
    10. 10 <body>
    11. 11     <div >
    12. 12         <div>
    13. 13             @using (Ajax.BeginForm("login", null, new AjaxOptions()
    14. 14                         {
    15. 15                             HttpMethod = "Post",
    16. 16                             OnBegin = "dig.Loading",
    17. 17                             OnSuccess = "dig.Success",
    18. 18                             OnFailure = "dig.Failure",
    19. 19                             OnComplete = "dig.Complete"
    20. 20                         }, new { @class = "form-signin" }))
    21. 21             {
    22. 22                 @Html.AntiForgeryToken()
    23. 23                 @Html.TextBoxFor(model => model.ACCOUNT,
    24. 24                                                         new
    25. 25                                                         {
    26. 26                                                             @class = "form-control",
    27. 27                                                             @placeholder = "登录用户名",
    28. 28                                                             @maxlength = 15,
    29. 29                                                             @required = "required"
    30. 30                                                         })
    31. 31                 @Html.PasswordFor(model => model.PASSWORD,
    32. 32                                                         new
    33. 33                                                         {
    34. 34                                                             @class = "form-control",
    35. 35                                                             @placeholder = "登录密码",
    36. 36                                                             @maxlength = 12,
    37. 37                                                             @required = "required"
    38. 38                                                         })                     
    39. 39                 <button type="submit" id="login-button"></button>
    40. 40             }
    41. 41            
    42. 42         </div>
    43. 43      
    44. 44     </div>
    45. 45
    46. 46   
    47. 47     <script type="text/javascript" src="/Content/js/jquery.min.js"></script>
    48. 48     <script type="text/javascript" src="/Content/js/jquery.unobtrusive-ajax.min.js"></script>
    49. 49     <script type="text/javascript">      
    50. 50         var dig = {
    51. 51             Loading: function () {
    52. 52                 $("#login-button").attr("disabled", "disabled");;
    53. 53             },
    54. 54             Success: function (result) {
    55. 55                 if (result.Status == "y") {
    56. 56                     alert(result.Msg)
    57. 57                 } else {
    58. 58                    alert(result.Msg);
    59. 59                     dig.Complete();
    60. 60                 }
    61. 61             },
    62. 62             Failure: function () {
    63. 63                 alert(result.Msg);
    64. 64                 dig.Complete();
    65. 65             },
    66. 66             Complete: function () {
    67. 67                 $("#login-button").attr("disabled", false);
    68. 68             },
    69. 69             ErrorMsg: function (msg) {
    70. 70                 alert(msg);
    71. 71             }
    72. 72         };
    73. 73     </script>
    74. 74
    75. 75 </body>
    76. 76 </html>
    复制代码

      
    View Code

    我们新建一个登陆验证的方法 Login



      
    1. 1         /// <summary>
    2. 2         /// 登录验证
    3. 3         /// add yuangang by 2016-05-16
    4. 4         /// </summary>
    5. 5         [ValidateAntiForgeryToken]
    6. 6         public ActionResult Login(Domain.SYS_USER item)
    7. 7         {
    8. 8             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
    9. 9             try
    10. 10             {
    11. 11                 //调用登录验证接口 返回用户实体类
    12. 12                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
    13. 13                 if (users != null)
    14. 14                 {
    15. 15                     //是否锁定
    16. 16                     if (users.ISCANLOGIN == 1)
    17. 17                     {
    18. 18                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
    19. 19                         return Json(json);
    20. 20                     }
    21. 21                     json.Status = "y";
    22. 22
    23. 23                 }
    24. 24                 else
    25. 25                 {
    26. 26                     json.Msg = "用户名或密码不正确";
    27. 27                 }
    28. 28
    29. 29             }
    30. 30             catch (Exception e)
    31. 31             {
    32. 32                 json.Msg = e.Message;
    33. 33             }
    34. 34             return Json(json, JsonRequestBehavior.AllowGet);
    35. 35         }
    复制代码

      
    View Code

      
    重新生成一下解决方案,我们来测试一下

      
      
    咦~~报错了~~~(不要担心报错,报错是我们DeBug并且梳理流程的好机会哈~)

      
    我们先来研究一下这个错误:
    捕捉到 System.NullReferenceException
    HResult=-2147467261
    Message=未将对象引用设置到对象的实例。
    Source=WebPage
    StackTrace:
    在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER item) 位置 e:\Visual Studio 2013\BlogDemos\wkmvc\WebPage\Areas\SysManage\Controllers\AccountController.cs:行号 37
    这是什么错误呢,错误在这一行 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim()); 这应该是UserManage 未将对象引用设置到对象的实例,我们分析,有可能是我们声明的容器出错了。
    但是,我们的声明和注入貌似没有什么问题啊,那是怎么回事呢,我们看一下 我们Web.Config里的配置

    我们还没有添加Spring.net组件啊~~~
    添加一下,NetGet包  

      
    还有Common.Logging
    我们的Spring有几个dll 分别是Spring.Core、Common.Logging、Spring.Web.Mvc(我们这里用的是Spring.Web.Mvc5)
    检查一下,这几个dll是否引用了

      
    现在运行一下,是不是还是报错呢~~还是为将对象设置引用到实例~~怎么回事呢?好像忘了些什么,仅仅只是配置配好了,spring.net的容器还没有接管这一切……在这我们只需要让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMVCApplication类即可,根据需要override相关方就可以了

      
      
    OK!运行正常~~~~

      
      
    可能出现的问题:

      
    或:

      
    解决:
    我们添加Microsoft.AspNet.WebApi(如果存在就更新一下)

      
    或通过NuGet 程序包管理器控制台添加:
    Install-Package Microsoft.AspNet.WebApi
    Update-Package Microsoft.AspNet.WebApi -reinstall(存在)
    原因:我们新建的是一个空的MVC项目,缺少引用
      
      
    四、使用Log4net
    我们添加一下log4net的类库 【C#公共帮助类】 Log4net 帮助类

      
    我们在AccountController控制器中声明一下

      
      
    我们修改一下 登录验证方法Login

      
      
    代码:



      
    1. 1 using Common;
    2. 2 using Service.IService;
    3. 3 using System;
    4. 4 using System.Collections.Generic;
    5. 5 using System.Linq;
    6. 6 using System.Web;
    7. 7 using System.Web.Mvc;
    8. 8
    9. 9 namespace WebPage.Areas.SysManage.Controllers
    10. 10 {
    11. 11     public class AccountController : Controller
    12. 12     {
    13. 13         #region 声明容器
    14. 14         /// <summary>
    15. 15         /// 用户管理
    16. 16         /// add yuangang by 2016-05-16
    17. 17         /// </summary>
    18. 18         IUserManage UserManage { get; set; }
    19. 19         /// <summary>
    20. 20         /// 日志记录
    21. 21         /// </summary>
    22. 22         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
    23. 23         #endregion
    24. 24
    25. 25         #region 基本视图
    26. 26         public ActionResult Index()
    27. 27         {
    28. 28             return View();
    29. 29         }
    30. 30         /// <summary>
    31. 31         /// 登录验证
    32. 32         /// add yuangang by 2016-05-16
    33. 33         /// </summary>
    34. 34         [ValidateAntiForgeryToken]
    35. 35         public ActionResult Login(Domain.SYS_USER item)
    36. 36         {
    37. 37             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
    38. 38             try
    39. 39             {
    40. 40                 //调用登录验证接口 返回用户实体类
    41. 41                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
    42. 42                 if (users != null)
    43. 43                 {
    44. 44                     //是否锁定
    45. 45                     if (users.ISCANLOGIN == 1)
    46. 46                     {
    47. 47                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
    48. 48                         log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    49. 49                         return Json(json);
    50. 50                     }
    51. 51                     json.Status = "y";
    52. 52                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    53. 53
    54. 54                 }
    55. 55                 else
    56. 56                 {
    57. 57                     json.Msg = "用户名或密码不正确";
    58. 58                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    59. 59                 }
    60. 60
    61. 61             }
    62. 62             catch (Exception e)
    63. 63             {
    64. 64                 json.Msg = e.Message;
    65. 65                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    66. 66             }
    67. 67             return Json(json, JsonRequestBehavior.AllowGet);
    68. 68         }
    69. 69         #endregion
    70. 70
    71. 71         #region 帮助方法
    72. 72         #endregion
    73. 73     }
    74. 74 }
    复制代码

      
    View Code

      
    今天就先写到这,下一篇,我们继续完善这个登录功能~~~好累~~~
    你们先自己做一下,遇到问题百度也好,留言也好,咱们解决一下。稍后我把这一部分的Demo 提供一下下载。
      
    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 20:18 , Processed in 0.434411 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表