在很多网站有些页面是不允许非注册的用户访问
比如在论坛里,如果是游客那么可以看别人发的帖子和别人回的帖子,但是油库却不可以回帖
就要以注册过成为本论坛用户后才可以回帖
那么这个如何实现呢?
可能你会选择jsp 将回复帖的页面的代码中判断是否具有用户名
这个方法也可以,但是如果面对的需要是某个权限才可以访问的页面特别多的时候,此时这个方法就显得需要重复写很多代码
考虑到这一点,可以选择使用Filter(过滤器)来实现对权限页面的控制
下面就是一个对auth文件中的页面访问时候需要为登陆过的用户才能访问
首先要建立一个过滤器来实现权限控制类
//CheckFilter.java
package cn;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckFilter implements Filter...{
private FilterConfig filterConfig;
//登陆页面,当用户没有登陆时,将会首先转到这个页面
private String loginPage="/first/LoginPage.jsp";
public void destroy() ...{
// TODO Auto-generated method stub
filterConfig=null;
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException ...{
// TODO Auto-generated method stub
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
//通过判断session 中是否具有auth 参数来判断用户是否已经登陆
HttpSession session=req.getSession(true);
//如果已经登陆
if(session.getAttribute("auth")!=null)...{
chain.doFilter(req,res);
return;
}///尚未登陆
else...{
ServletContext ctx=filterConfig.getServletContext();
setForwardURI(req);
ctx.getRequestDispatcher(loginPage).forward(req, res);
}
}
//设置原始的请求URL 
private void setForwardURI(HttpServletRequest request)...{
//首先获得用户所请求的资源
StringBuffer requestURI=new StringBuffer(request.getRequestURI());
//以及所附的请求字符串,如showMsg?name=Alex中的?后面的内容
String queryString=request.getQueryString();
if(queryString!=null)...{
requestURI.append("?").append(queryString);
}
//将用户的原始资源放到request的属性中
request.setAttribute("orignURL",requestURI.toString());
}

public void init(FilterConfig config) throws ServletException ...{
// TODO Auto-generated method stub
//通过FilterConfig获得 web.xml 中设置的初始化参数
filterConfig=config;
if(filterConfig.getInitParameter("loginPage")!=null)...{
loginPage=filterConfig.getInitParameter("loginPage");
}
}
}
然后写页面
LoginPage.jsp 页面用来让用户登录的页面

<%...@page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>
登陆页面
</title>
</head>
<body>
<h1>请登陆</h1>
<form name="login" method="post" action="/xiao/login.jsp">
姓名: <input type="text" name="user">
<br>
密码: <input type="password" name="pwd">
<br>
<input type="hidden" name="targetUrl" value="<%=request.getAttribute("orignURL")%>">
<input type="submit" name="sumit" value="submit">
</form>
</body>
</html>
以及对LoginPage.jsp处理的/xiao/login.jsp

<%...@page session="true" contentType="text/html;charset=GBK"%>
<%...
session.setAttribute("auth","yes");
String targetUrl=request.getParameter("targetUrl");
if(targetUrl!=null){
out.println(targetUrl);
response.sendRedirect(targetUrl);
}
else{
out.println("登陆登陆! ");
}
%>
以及auth文件目录下的ni.jsp
<html>
<head>
<title>english</title>
</head>
<body>
can you seapk english?
</body>
</html>
做完以上工作后,那么我们来配置以下web.xml
文件
需要在web.xml写入
<filter>
<filter-name>Check Filter</filter-name>
<filter-class>cn.CheckFilter</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/LoginPage.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Check Filter</filter-name>
<url-pattern>/auth/*</url-pattern>
</filter-mapping>
本文介绍了一种利用Java Servlet Filter实现的论坛权限控制方案。通过检查用户会话中的认证标记,未登录用户将被重定向到登录页面,登录用户则可访问受保护页面。

被折叠的 条评论
为什么被折叠?



