我看了下,登录的时候,走的是直接是 检验的接口
点击登录 触发 verification.do
LginController
@Controller
public class LoginController{
protected static final Logger log = LoggerFactory.getLogger(LoginController.class);
@Autowired
UserService userService;
@Autowired
UserMapper userMapper;
@Autowired
SettingMapper settingMapper; //查 设置信息?
@Autowired
PositionInfoMapper positionInfoMapper; //查职位详情?
@Autowired
PermissionMapper permissionMapper; //查权限?
/*用户登录---不过这个接口好像都没用到。毕竟还是老的jsp
*/
@RequestMapping("/login.do")
public String login(HttpServletRequest request ,HttpServletResponse response)throws Exception{
return "jsp/login/login"; //springMVC的配置,省略了.jsp
}
/*登出系统
/
@RequestMapping("/logout.do")
@ResponseBody
public String logout(HttpServletRequest request ,HttpServletResponse response){
try{
clearSession(request); //清除session
return StringUtils.resultSuccessToJson(SystemUtils.getMessage("system.logout.success")); //就是“登出成功”
}catch(Exception e){
return StringUtils.resultFailToJson(e);
}
}
}
//2019-03-25 --清除会话
public static final void clearSession(HttpServletRequest request) throws Exception{
try{
Enumeration<String> names = request.getSession.getAtrributeNames();
while(names.hasMoreElements() ){
String name = names.nextElement();
request.getSession.removeAttibute(name);
}
}catch(Exception e){
e.printStackTrace();
}
//登录--用户校验--设置用户信息--添加token--初始化权限--系统信息设置
@RequestMapping("/verification.do")
@ResponseBody
public String verification(@RequestBody UserModel user,HttpServletRequest reuqest ,HttpServletResponse response)throws Exception{
try{
UserModel loginuser = verification(user);
write(request,loginuser);
}catch(Exception e){
clearSession(request);
return StringUtils.resultFailToJson(e);
}
}
//校验
public final UserModel verification(UserModel user)throws Exception{
//清除会话--防止重复登录。
clearSession(SystemUtils.getHttpServletRequest());
if(null == user){ throw new Exception("登录名或者密码不能为空"); }
if(!StringUtils.isNotNullOrEmptyStr(user.getLoginName())){ throw new Exception("登录名不能为空"); }
if(!StringUtils.isNotNullOrEmptyStr(user.getLoginPwd())){ throw new Exception("密码不能为空"); }
SystemUtils.setSessionId(JWTUtils.getToken()); //这个SystemUtils里面的变量副本,有很多,用来存值,比如token,currenConfigModel,request,userModel等。
SystemUtils.setCurrentConfigModel(new CurrentConfigModel()); //存CurrentConfigModel,用户成功登录后,再把信息放入CurrentConfigModel中。
boolean ldap = "true".equals(Property.getAppContext("ldap.switch"));
user = userService.loginCheck(user.getLoginName(),user.getLoginPwd(),ldap);
user.setConfig(SystemUtils.getCurrentConfigModel()); //实际上到这里,UserModel中的config依然是空的。但是这里我不是很明白,
//这里是从副本中拿的,但是副本中存的是一个new 出来的对象,怎么会有值?我debug确实有值啊。
SystemUtils.addToken(SystemUtils.getSessionId()); //这一步在SystemUtils中就只是一个方法,方法体都没有。应该不写 也可以。
//初始化权限
initPermission(SystemUtils.getHttpServletRequest());
user.setToken(SystemUtils.getSessionId());
//权限列表查询
PermissionModel model = new PermissionModel();
model.setUserId(SystemUtils.getUserModel().getRowId());
List<PermissionModel> permissionList = permissionMapper.queryPermission(model);
SystemUtils.setPermissionList(permissionList);
return user;
}
//记录用户信息--比如用户登录时候Ip地址,浏览器,版本,系统,登录时间等等,这样可以更加直观的解决用户问题。
void write(HttpServletRequest request ,UserModel model){
try{
SessionInfoModel model = getSessionInfoModel(request,user);
userMapper.insertLoginInfo(model);
}catch(Exception e){
e.printStackTrace();
}
}
//获取用户登录时系统信息
SessionInfoModel getSessionInfoModel(HttpServletRequest request ,UserModel user){
SessionInfoModle model = new SessionInfoModel();
String ua = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(ua);
String remoteAddr = NetUtils.getIpAddress(request); //获取,远程Ip地址-ipV4
model.setAddress(remoteAddr); //设置
Browser browser = userAgent.getBrowser();
model.setBrowser(browser.getName());
model.setBrowserVersion(userAgent.getBrowserVersion().getversion());
OperatingSystem os = userAgen.getOperatingSystem();
model.setOs(os.getName());
model.setLoginName(user.getLoginName());
model.setName(user.getName());
model.setServerIp(NetUtils.getLocalIpAddr().toString());
model.setSessionId(request.getRequestedSessionId());
return model;
}
}//类尾
//本来想弄登录的,没想到走到这个方法的时候,去看了下 ResourceBundle,又顺便补了下导出Excel,加了例子和说明,这样大家直接复制粘贴后就可以根据 例子导出Excel了。所以到下班还没弄到登录。下周在弄登录。
而且项目里面 登录进去后,触发了22个接口,我日我日我日。头大。无非就是各个模块。
//真的是 日了狗了,本来全部都写好了,但是忘记发布了,午睡起来后,长时间未反应,远程桌面直接被关闭了,又要重新 写。下次记得 午睡前一定要 发布!
//各种Model及其字段如下:
UserModel PermissionModel ConfigModel SessionInfoModel
1:UserModel(基础实体)extends BaseModel :
token–口令 position–职位 name–名字 email–电子邮件 birthday–生日 fax–传真 majorNet—主要网络 sex—性别
loginName—登陆名字 loginPwd—登陆密码 address—地址 department—部门 company—公司 firstName—名 lastName—姓
password1 password2 loginNames—查询用:需要查询的所有loginName CurrentConfigModel config—当前配置信息
除了最后一个字段,其他都是String类型。
2:PermissionModel implements Serializable
userId–用户Id vkey—视图key vname—视图名称 fkay—功能点key fname—功能点名称 vtype—视图类型 type—功能点类型
permit—功能点权限:0可读可见 1可读可写可见可点击 searchText–查询条件
3:ConfigModel(埋点信息)extends BaseModel
value—值 description—描述信息 List<String> notKeys
4:SessionInfoModel
name—登录人名字(非工号) brower—发送请求的浏览器 browerVersion–浏览器版本 os—操作系统 address—客户端Ip地址(v4)
serverIp—服务器地址 sessionId----请求的会话Id loginName—登录人账号
师父说过各Model中字段的前2个字母必须为小写。之前碰到过这种问题,忘记为什么了,反正以后记住就行,好像是get,set方法碰到前2个大写字母的时候无法解析。
然后初始化权限的sql 如下,我以为是置空,但不是的,只是查询
具体如下:
<id column="key" property="rowId" />
<result column="TOTAL_NUM " property="totalRecords" />
<result column="CUR_PAGE" property="curPage" />
<result column="VALUE" property="value" />
<result column="DESCRIPTION" property="decription">
</resultMap>
<select id="getConfigAllList" resultMap = "ConfigMapper" parameterType="com.xxxxx.common.model.ConfigModel" >
select t.*
from T_CONFIG t
<where>
<if test="rowId != null and rowId != '' ">and t.KEY like '%'||#{rowId}||'%'</if>
<if test="deacription != null and description != '' ">and t.DESCRIPTION like '%'||#{description}||'%'</if>
<if test="notKeys != null">
and t.KEY not in
<foreach collection="notKeys" index="index" item="item" open="(" separator="," close=")" >
#{item}
</foreach>
</if>
</where>
order by t.KEY,t.DESCRIPTION
</select>