ssm框架实现用户登录的拦截器和过滤器
实现用户登录过程的验证,用拦截器和过滤器可以拦截用户没有登录的情况下,不能进行访问系统页面
以下是自定义拦截器工程目录实现的过程:
1:新建一个 interceptor 拦截器包,创建一个 LoginInterceptor 拦截器类
2:将这个类,继承 HandlerInterceptor 接口,并实现 HandlerInterceptor 这个接口的三个方法
public class LoginInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// 执行完毕,返回前拦截
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// 在处理过程中,执行拦截
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)
// 返回false则不执行拦截
HttpSession session = request.getSession();
//String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1) {// 说明登录成功 或者 执行登录功能
if(session.getAttribute("LOGIN_USER")!=null) {
// 登录成功不拦截
return true;
}else {
// 拦截后进入登录页面
response.sendRedirect(request.getContextPath()+"/system/login");
return false;
}
}
}
3:拦截器是要配置的,将这个类,配置在 spring-mvc.xml 的配置文件中,如下:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有mvc控制器 -->
<mvc:mapping path="/**"/>
<!-- mvc:exclude-mapping是另外一种拦截,它可以在你后来的测试中对某个页面进行不拦截,这样就不用在
LoginInterceptor的preHandler方法里面获取不拦截的请求uri地址了(优选) -->
<mvc:exclude-mapping path="/system/login" />
<bean class="com.lingshi.bookstore.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
将登陆拦截器类 LoginInterceptor,配置到里面
这个拦截器有2个知识要点:
①:
<mvc:mapping path="/**"/> 是已经拦截了所有请求,包括登录,如果后来想不拦截某个页面,就在拦截配置里面配置
<mvc:exclude-mapping path="/system/login" />
②:也可以不在配置文件里拦截某个页面请求,在拦截类里面获取拦截路径,然后做个判断
eg:
//String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1)
4:页面:
<div align="center">
<br><br><br>
<!-- 作业:post方法与get方法的区别 -->
<form action="${pageContext.request.contextPath}/system/login" method="post">
<p>用户登录</p>
账号:<input name="account" type="text" />
<br><br>
密码:<input name="password" type="password" />
<br><br>
<input type="reset" value="撤 销" />
<input type="submit" value="提 交" />
</form>
</div>
二:过滤器
过滤器就分两步:新建过滤器类,接着配置web.xml
1:建一个LoginFilter 类,继承 Filter 类
public class LoginFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
if(session.getAttribute("LOGIN_USER")==null
&& request.getRequestURI().indexOf("/system/login") == -1){
// 没有登录
response.sendRedirect(request.getContextPath()+"/system/login");
}else{
// 已经登录,继续请求下一级资源(继续访问)
arg2.doFilter(arg0, arg1);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
2:配置 web.xml ,在字符过滤器下面接着配置一个过滤器
<!-- 使用filter实现登录控制 -->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.lingshi.bookstore.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<!-- 所有的管理页面需要登录后才能访问 -->
<url-pattern>/views/*</url-pattern>
</filter-mapping>
将过滤器类 LoginFilter 配置到 过滤器配置文件中,即可完成
过滤器也实现了