================================

©Copyright 蕃薯耀 2020-01-10

https://www.cnblogs.com/fanshuyao/

一、Java权限过滤器,如登录过滤

增加了配置文件,配置不拦截的请求,可以自定义不拦截的规则,有三种:

1、不拦截包含/service/的请求(*/service/*)

2、不拦截以aaa/bbb/开头的请求(aaa/bbb/*)

3、不拦截以/ccc/aa.action结尾的请求(*/ccc/aa.action)

过滤器代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class SessionFilter implements Filter {
protected final Log logger = LogFactory.getLog(SessionFilter.class);
private Set<String> unFilterSet = new HashSet<String>(); @Override
public void init(FilterConfig config) throws ServletException {
InputStream in = null;
BufferedReader reader = null;
try {
in = SessionFilter.class.getClassLoader().getResourceAsStream("sessionUnFilter.properties");
if(in != null){
reader = new BufferedReader(new InputStreamReader(in));
String lineText = null;
logger.info("=====不拦截的匹配规则有:");
while((lineText = reader.readLine()) != null){
if(!StringUtils.isBlank(lineText) && (!lineText.trim().startsWith("#"))){//过滤掉空行和注释行
logger.info("=====" + lineText);
unFilterSet.add(lineText);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} logger.info("SessionFilter init()");
} @Override
public void destroy() {
logger.info("SessionFilter destroy()");
} /**
* 如果请求链接符合不拦截的匹配,返回true
* @param unFilterSet
* @param requestURI
* @return
*/
public boolean isPass(Set<String> unFilterSet, String requestURI){
logger.info("=====requestURI = "+requestURI);
if(unFilterSet != null && unFilterSet.size() > 0){
for (String unFilterUri : unFilterSet) {
if(!StringUtils.isBlank(unFilterUri)){
unFilterUri = unFilterUri.trim();
if(unFilterUri.equals(requestURI)){
return true;
}else if(unFilterUri.startsWith("*") && unFilterUri.length() > 1 && unFilterUri.endsWith("*")){
String text = unFilterUri.substring(1, (unFilterUri.length() - 1));
//logger.info("=====contains text = " + text);
if(requestURI.contains(text)){
return true;
}
}else if(unFilterUri.startsWith("*") && !unFilterUri.endsWith("*")){
String text = unFilterUri.substring(1, (unFilterUri.length()));
//logger.info("=====endsWith text = " + text);
if(requestURI.endsWith(text)){
return true;
}
}else if(!unFilterUri.startsWith("*") && unFilterUri.endsWith("*")){
String text = unFilterUri.substring(0, (unFilterUri.length() - 1));
//logger.info("=====startsWith text = " + text);
if(requestURI.startsWith(text)){
return true;
}
}
}
}
}
return false;
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse; boolean isAjaxRequest = false;//判断是否Ajax请求
if(!StringUtils.isBlank(req.getHeader("x-requested-with")) && req.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
isAjaxRequest = true;
}
UserInfo userInfo = null;
try {
userInfo = SecurityExtApi.getUserInfo(req);
} catch (GeneralFailureException e) {
e.printStackTrace();
}
if(userInfo != null && !StringUtils.isBlank(userInfo.getUserID())){
chain.doFilter(req, res);
}else{
String requestURI = req.getRequestURI();
//logger.info("=====requestURI = "+requestURI);
if(requestURI.endsWith(".js") || requestURI.endsWith(".css") || requestURI.endsWith(".png")
|| requestURI.endsWith(".jpg") || requestURI.endsWith(".jpeg") || requestURI.endsWith(".gif")
|| requestURI.endsWith(".ico")){
chain.doFilter(req, res);
return;
}else if(isPass(unFilterSet, requestURI)){
chain.doFilter(req, res);
return;
}else{
String msg = "登录已失效,请刷新页面或重新登录";
logger.info("=====" + msg);
if(isAjaxRequest){//Ajax请求结果处理
res.setContentType("application/json;charset=GBK");
res.setCharacterEncoding("GBK");
res.setHeader("error_code", "-999");
res.setHeader("error_msg", "The login is timeout, please login again!");
throw new RuntimeException(msg);//需要增加Ajax异常处理js全局配置文件ajax.config.js
}else{
res.sendRedirect("/");
}
}
}
}
}

不拦截请求配置文件(sessionUnFilter.properties)如下:

#配置说明:
#*/services/* :不拦截包含/services/路径的
#/aa/startwith/* :不拦截以/aa/startwith/开头的
#*/endwith/end.jsp :不拦截以/endwith/end.jsp结尾的 /pro_name/aaa/login_local.jsp
/pro_name/bbb/ccc.action
*/services/*

Ajax请求处理需要增加一个js的全局处理配置文件

$(document).ajaxError(function(event,XHR){
var error_code = XHR.getResponseHeader("error_code");
var error_msg = XHR.getResponseHeader("error_msg");
if(error_code != null && error_code != undefined){
if("-999" == error_code){
error_msg = "异常信息:登录已失效,请重新登录或刷新页面";
}else{
error_msg = "异常信息:"+ error_msg;
}
error_code = "异常代码:"+error_code;
var error_tip = error_code +"<p>" + error_msg;
top.$.messager.alert('异常提示:',error_tip,'error');
}
});

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!)

================================

©Copyright 蕃薯耀 2020-01-10

https://www.cnblogs.com/fanshuyao/

Java 过滤器Filter,Java Filter 不拦截某些请求 Java 过滤器支持Ajax请求的更多相关文章

  1. ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式

    一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并 ...

  2. springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置

    web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...

  3. Java Spring Boot VS .NetCore (二)实现一个过滤器Filter

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  4. JAVA过滤器的使用(Filter)

    request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf ...

  5. java:Filter、Listener 自定义拦截器和过滤器应用

    一,Filter FilterEncoding 过滤器,统一设置servlet的编码格式. package com.dkt.filter; import java.io.IOException; im ...

  6. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题

    后台增加filter,注意不要把druid也屏蔽了 import java.io.IOException; import javax.servlet.Filter; import javax.serv ...

  7. JAVA中的使用Filter过滤器设置字符集

    Filter是什么? Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response.它虽然不能产生一个response,但可以在一个req ...

  8. java Servlet Filter 拦截Ajax请求

    /** * 版权:Copyright 2016-2016 AudaqueTech. Co. Ltd. All Rights Reserved. * 描述: * 创建人:赵巍 * 创建时间:2016年1 ...

  9. java日志框架系列(9):logback框架过滤器(filter)详解

    过滤器放在了logback-classic模块中. 1.logback-classic模块中过滤器 分类(2种):常规过滤器.TurboFilter过滤器. 1.常规过滤器 常规过滤器可以通过自定义进 ...

随机推荐

  1. Day6 - D - Tree 园丁的烦恼 HYSBZ - 1935

    很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题, ...

  2. 013.Delphi插件之QPlugins,模块化代码示例

    这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...

  3. HTTP实战

    1.建立http服务,要求: (1)提供两个基于名称的虚拟主机: www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/erro ...

  4. .Net有哪些大型项目、大型网站的案例?

    .Net开发的部分知名网站案例:http://www.godaddy.com 全球最大域名注册商http://www.ips.com 环迅支付,国内最早的在线支付平台http://www.icbc.c ...

  5. 从Http上返回Json数据

    我们现在先在浏览器访问一下,看到下面返回的结果: 接下来就是大家最喜欢的写代码环节,为了方便演示,我们这里用winform程序.非常简单,我们新建一个窗体程序,点击后,弹出JSON数据即可.界面如下: ...

  6. JS - 获取页面滚动的高度

    document.documentElement.scrollTop||document.body.scrollTop

  7. 《TensorFlow实战Google深度学习框架》笔记——TensorFlow环境搭建

    一.TensorFlow的主要依赖包 1.Protocol Buffer Protocol Buffer负责将结构化的数据序列化,并从序列化之后的数据流中还原出原来的结构化数据.TensorFlow中 ...

  8. 《新标准C++程序设计》3.1.4-3.2(C++学习笔记6)

    1.类型转换构造函数 (1)定义 只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是转换构造函数. 当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量). ( ...

  9. java排序,效率高的是哪种排序方法

    和所有其他语言是一样的.应该还是快速排序效率最高. public static void bubbleSort(int a[]) {int len = a.length;for (int i = 0; ...

  10. Java 第一次课堂测试总结。

    Java 第一次课堂测试总结. 昨天参加了JAVA的开学测试,课上没有完成计算基点的功能,以下是修改完成后的代码.  首先是ScoreInformation类来存储学生信息. //信1805-1 王正 ...