最近工作需要做一个IP控制功能,项目有两个登陆页面,分为前台后台登陆页面。后台登陆页面,不要暴露给普通用户,需要进行IP控制。
1.web.xml 配置filter
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list><filter>
<filter-name>ipFilter</filter-name>
<filter-class>com.esoft.archer.system.filter.IpFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ipFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
</web-app>
这里需要注意的是你的filter的优先级别,如果你有多个filter的话请根据自己的优先级别,把需要优先过滤的条件放在最上面,filter的先进后出原则。
public class IpFilter implements Filter {
private final static Log log = LogFactory.getLog(IpFilter.class);
HibernateTemplate ht;
LoginUserInfo loginUserInfo;
@Override
public void destroy() {
if (log.isInfoEnabled()) {
log.info("ipFilter destroyed...");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
ht = (HibernateTemplate) SpringBeanUtil.getBeanByName("ht");
// 获取访问IP
String ipString = getIpAddr(httpRequest);
//业务相关,可以根据自己的业务要求修改
String hql = "from AcceptLoginIp ali where ali.value=? and ali.status =?";
List<AcceptLoginIp> alis = ht.find(hql, new String[] { ipString,ALIConstants.USABLE });
if (alis != null && alis.size() > 0) {
// 如果有继续...
filterChain.doFilter(request, response);
} else {
// 重定向至错误页面
httpResponse.sendRedirect("/qtwang/error");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
if (log.isInfoEnabled()) {
log.info("ipFilter init start ...");
}
}
protected String getIpAddr(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
}
这里就没有什么好注意的了,唯一需要注意的就是加载过程中资源是否能访问的到,如果访问部到,自己根据自己的项目区修改下吧。
祝工作愉快!!!lol