原创地址:https://blog.csdn.net/QQ826688096/article/details/89075598
当今社会,无奇不有,有的人很懒,直接写个html文档,然后直接把里面写了一堆的<a>标签,直接链接到别人家的系统,这,竟然就成了他们所谓的“门户”了,笑死我了。但是这也反映出一个问题,就是我们自己的系统要杜绝让其他的未知系统随意链接到自己的系统中来,我们应该跟手机通讯录一样,有一个自己可管理的白名单。
那么,web系统的白名单怎么设计呢?我想了个办法,当然,也是公司正在使用的实例。
厉害的你可能已经猜的差不多了,就是过滤器。
第一步:在项目的配置文件 web.xml 中的对应位置加入过滤器配置
代码如下:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.*.*.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
图片如下:
第二步:创建 CharacterEncodingFilter java文件
该java源文件内容:
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
import com.incon.framework.util.propertiesLoader;
public class CharacterEncodingFilter extends OncePerRequestFilter {
/**
request.getHeader("referer")获取来访者地址。只有通过链接访问当前页的时候,才能获取上一页的地址;
否则request.getHeader("referer")的值为null,通过window.open打开当前页或者直接输入地址,也为null。
若从 http://xxx/a.jsp 上 点击 a标签 至 http://XXXX/b.jsp
b.jsp 获取 request.getHeader("referer") 返回 http://xxx/a.jsp
*/
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest requesta = new Request((HttpServletRequest) request);
response.setHeader("Set-Cookie", "name=value; HttpOnly");
String referer = request.getHeader("Referer"); // REFRESH
if ((referer != null && referer.indexOf(request.getContextPath()) < 0)) {
//允许哪些网站可以外链接,多个网站已“,”号隔开
String system_wz = getPropertyKey("/**/config.properties", "system.wz");
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpServletRequest servletRequest = (HttpServletRequest) request;
boolean b = false;
String wz[] = system_wz.split(",");
for (int i = 0; i < wz.length; i++) {
if (referer.indexOf(wz[i]) > -1) {
b = true;
break;
} else {
b = false;
}
}
if (b) {
chain.doFilter(servletRequest, servletResponse);
} else {
servletResponse.sendRedirect(servletRequest.getContextPath()+ "/error.jsp");
}
}else {
chain.doFilter(requesta, response);
}
}
/**获取配置文件*/
public String getPropertyKey(String path,String key){
InputStream inStream = this.getClass().getResourceAsStream(path);
Properties pro = new Properties();
try {
pro.load(inStream);
}catch (IOException e) {
throw new RuntimeException("加载配置文件出错!");
}
return pro.getProperty(key);
}
class Request extends HttpServletRequestWrapper {
public Request(HttpServletRequest request) {
super(request);
}
@Override
public String[] getParameterValues(String name) {
return super.getParameterValues(name);
}
}
}
核心代码如下图:
第三步:建立 config.properties 白名单配置文件
在项目的配置文件的统一管理的文件夹里面建立 config.properties 这个文件
文件内容如下:
system.wz=jwxt
图片如下:
说明:当其他的系统,通过跳转,跳转到本系统中的某个地址时,链接地址中除了带有config.properties这个配置文件中的“jwxt”字样的以外都不允许直接跳转过来,也就是说,只有config.properties这个白名单中的系统代码才可以直接跳转过来。
比如从另一个地址直接调转到本系统的登录页面。如果不做该配置,那么任何系统都可以直接跳转过来,相当不安全。
这里如果是,想设置多个系统到该白名单中,那么,只需要在system.wz的值里面,使用英文的“,”逗号隔开就可以了,案例:
System.wz=jwxt,cwxt,rsxt,tyxt