SSM框架使用拦截器和过滤器实现登录的拦截
在ssm的普通项目中登录如不进行拦截操作,那么通过虚拟路径进行跨页面展示是十分危险的,安全起见需要需要进行登录的拦截,如果没有登录(没有包含用户信息)那么强制跳转到登录页面,不允许没有登陆即访问其他页面。
过滤器和拦截器区别:
- 使用范围不同: Filter 是Servlet规范规定的,所以过滤器只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing 程序中。
- 规范不同:过滤器 Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。chenleixing
- 使用的资源不同:同其他的代码块一样, 拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而过滤器 Filter则不能。
- 深度不同: 过滤器-Filter 在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截
进入正题:
进行登录拦截需要创建两个类并分别配置
- 创建拦截器类并实现拦截器 HandlerInterceptor 接口
package com.wu.config;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 登录成功应该有session(在登陆的Controller中设置session)
Object admin = request.getSession().getAttribute("admin");
System.out.println(admin);
if (admin == null){
request.setAttribute("msg", "没有权限,请先登录!");
request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
return false;
}else {
return true;
}
}
}
- 在我们的springmvc.xml中配置拦截器类
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
// 所有请求都拦截
<mvc:mapping path="/**"/>
// 放行登录界面和登陆请求
<mvc:exclude-mapping path="/admin/login.jsp"/>
<mvc:exclude-mapping path="/admin/login.action"/>
// 拦截器类的位置
<bean class="com.wu.config.LoginHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 创建过滤器类并实现 Filter 接口
package com.wu.config;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginFiler implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
Object admin = request.getSession().getAttribute("admin");
if(admin == null && request.getRequestURI().indexOf("/admin/login.action") == -1){
// 没有登录 强制跳转到登录页面
request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
}else{
// 已经登录,继续请求下一级资源(继续访问)
filterChain.doFilter(request, response);
}
}
@Override
public void destroy() {
}
}
- 在web.xml中对过滤器进行配置
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.wu.config.LoginFiler</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
// admin下的所有请求和页面都要过滤
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
配置完成了,简单四步实现对于登录的拦截操作,想要不登录访问其他界面是不可能了,新手上路 有错误大家多多指教