共计 2367 个字符,预计需要花费 6 分钟才能阅读完成。
SSM 我的项目应用拦截器实现登录验证性能
登录接口实现
public User queryUser(String UserName, String Password,HttpServletRequest request, HttpServletResponse response) {User user = userMapper.queryUser(UserName,Password);
if(!StringUtils.isEmpty(user)){
//1. 获取 session
HttpSession session = request.getSession();
//2. 获取 sessionid
String sessionId = session.getId();
//3. 将 sessionid 作为 key,用户信息 user 作为 value,放入 session 中
session.setAttribute(sessionId,user);
//4. 将 sessionId 存到 cookie 中,"JSESSIONID" 为自定义的 key 值
Cookie cookie = new Cookie("JSESSIONID",sessionId);
//5. 设置 cookie 的无效门路
cookie.setPath(request.getContextPath());
//6. 将 cookie 返回给页面
response.addCookie(cookie);
}
return user;
}
代码思路:
1. 用户输出账号密码登录胜利后获取用户信息(User)
2. 获取 session,失去 sessionid(注:每一个 session 对象都有一个 sessionid)
3. 将 sessionid 作为 key,用户信息(User)作为 value,放入 session 中
4. 创立一个 Cookie 对象,将 ”JSESSIONID” 作为 key,sessionId 作为 value,放入 cookie 中
5. 设置 cookie 的无效门路,将 cookie 返回给页面,此时页面就能够收到 key 为 ”JSESSIONID”,value 为 sessionId 的 cookie 信息,如下图。
拦截器类代码实现
public class Filter extends HandlerInterceptorAdapter {private static Logger logger = Logger.getLogger(Filter.class);
/**
* 进入拦截器后首先进入的办法
* 返回 false 则不再继续执行
* 返回 true 则继续执行
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throws Exception
{
//1. 定义 sessionid 变量
String sessionid = "";
//2. 获取 session 对象
HttpSession session=request.getSession();
//3. 获取页面上所有的 cookie
Cookie[] cookies = request.getCookies();
//4. 循环寻找名称为 "JSESSIONID" 的 cookie
for(Cookie cookie:cookies){if(cookie.getName().equals("JSESSIONID")){sessionid = cookie.getValue();
}
}
//5. 依据 sessionid 获取用户信息
User user = (User) session.getAttribute(sessionid);
if(StringUtils.isEmpty(user)) {logger.info("用户未登录");
// 用户未登录跳转到登录页面
response.sendRedirect("login");
return false;
}
logger.info("用户已登录");
return true;
}
}
代码思路:
1. 自定义一个拦截器类,首先要继承 HandlerInterceptorAdapter,并重写 preHandle 办法,在此办法中编写拦截器的逻辑代码
2. 获取 cookies 数组,这个数组有浏览器中的所有 cookies 信息,循环遍历找到 name 为 ”JSESSIONID” 的 cookies,并获取到其 value 值,这个值就是 sessionid
3. 通过 sessionid 查找 user 对象,如果能获取对象证实登录过,如果不能获取到对象证实没有登录过
4. 如果登录过就间接拜访接口,如果没有登录过就跳转到登录页面进行登录
配置文件实现
<!-- 自定义拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置要拦挡的门路 -->
<mvc:mapping path="/**"/>
<!-- 配置登录接口不被拦挡 -->
<mvc:exclude-mapping path="/user/login"/>
<!-- 指定拦截器类门路 -->
<bean class="com.lishiqi.Util.Filter"></bean>
</mvc:interceptor>
</mvc:interceptors>
配置含意:
1. 咱们应用拦截器必定要规定拦挡哪些接口,首先咱们将所有的接口都拦挡
2. 而后咱们发现问题,此时登录接口也在拦挡范畴中,所以咱们失常调用登录接口之前他也会拦挡判断一下用户是否登录过,这个时候用户必定没有登录过,那么就会又跳转到登录界面,咱们再次登录还是跳转到登录页面,始终登录不上,所以咱们须要把登录接口配置为不拦挡
3. 而后咱们指定咱们配置好的拦截器类门路,这个时候能够在该类中进行登录验证操作了
4. 此配置文件为 spring-mvc.xml 配置文件