我们在进行web开发的时候,通常会限制用户的合法性,即登陆拦截和验证,只是为了保障系统的安全,只将我们规定的个别请求可直接访问,其余的必须经过拦截器来进行验证,那么拦截器到底该怎么写呢?下面就将Spring MVC和JFinal中的登录拦截器的写法记录一下,我们一起进步
Spring MVC中的登录拦截
1.编写登录拦截类
/**
* @ClassName: LoginFilter
* @author Liu_xg
* @date 2018年5月3日
* @Description: TODO 登陆拦截及验证
*/
public class LoginFilter implements Filter {
private String[] paths;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//设置字符集为utf-8
request.setCharacterEncoding("UTF-8");
String path=request.getServletPath();
for (String p : paths) {
if (path.equals(p)) {
chain.doFilter(request, response);
return;
}
}
HttpSession session=request.getSession();
try {
String username=(String) session.getAttribute("username");
if(username==null){
//判断session是否为空,为空的话就页面重定向到登陆界面
response.sendRedirect(request.getContextPath()+"/text/index");
return;
}
} catch (Exception e) {
// TODO Auto-generated catch block
//判断session是否为空,为空的话就页面重定向到登陆界面
response.sendRedirect(request.getContextPath()+"/text/index");
e.printStackTrace();
return;
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
// 将配置的放行url取出来
paths = config.getInitParameter("excPath").split(",");
}
}
2.在web.xml中配置不需要拦截的请求
<filter>
<filter-name>filter</filter-name>
<filter-class>com.ftwj.interceptor.LoginFilter</filter-class>
<init-param>
<param-name>excPath</param-name>
<param-value>/text/index,/text/login,/text/register,/check/loginname,
/check/password,/check/pswContain,/user/register</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中<param-value>标签中就是不需要拦截的请求
JFinal中的登录拦截
1.编写登录拦截类
/**
* @ClassName: LoginInterceptor
* @author Liu_xg
* @date 2018年5月10日
* @Description: TODO 登陆拦截器
*/
public class LoginInterceptor implements Interceptor {
@Override
public void intercept(Invocation inv) {
try {
//取到session
HttpSession session=inv.getController().getSession();
if(session==null){
inv.getController().redirect("/toLogin");
}else{
if(session.getAttribute("user")!=null){
User user=(User) session.getAttribute("user");
if(user!=null){
inv.invoke();
}else{
inv.getController().redirect("/toLogin");
}
}else{
inv.getController().redirect("/toLogin");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
inv.getController().redirect("/toLogin");
}
}
}
2.将拦截器注册到框架中
/**
* 配置路由
*
* @param me
*/
@Override
public void configRoute(Routes me) {
// 配置拦截器
me.addInterceptor(new LoginInterceptor());
me.add("/", LoginController.class, "/WEB-INF/views/login");
me.add("/main", MainController.class, "/WEB-INF/views/main");
me.add("/menu", MenuController.class, "/WEB-INF/views/menu");
me.add("/user", UserController.class, "/WEB-INF/views/user");
me.add("/role", RoleController.class, "/WEB-INF/views/role");
}
3.设置不需要拦截的请求
1).这种方式是将整个controller都不拦截
/**
* @ClassName: LoginController
* @author Liu_xg
* @date 2018年5月4日
* @Description: TODO 登陆控制器
*/
@Clear(LoginInterceptor.class)
public class LoginController extends Controller {
******
}
2).这种方式是不拦截此方法
/**
* 登陆,判断账号和密码是否正确
*/
@Clear(LoginInterceptor.class)
public void login() {
*********
}
网友评论