有一个java web项目, 用户登录信息存放在session中, 以"user"为key存放(如果"user"对应的值为空, 则说明用户没有登录), 要求只有登录的用户才能访问manager目录下的服务(manager/*.htm), 请写出大体思路, 并实现关键部分的代码
本题,我认为应该用过滤器,是最好的,1.访问manager目录下的服务(manager/*.htm),由于,此目录下都是静态文件,没法在html文件里写入java代码,对Session作校验,2.如果写成一个Servlet,配置映射路径为 manager/*,虽然能对以此结尾的URl作在Servlet里做校验,但无法跳转到指定的html文件,例如:manager/test1.html,此时,不会是直接访问该静态文件,而是又是映射到Servlet中,以此循环,无法实现访问静态文件。由于有这些性质,所以只能用过滤器方式来实现这种功能。过程:先实现一个过滤器,包括配置及处理类,映射路径写成manager/*,因此只要出现此映射结尾的,都会转到处理类上,并对Session用校验,未登陆的,才跳转到用户登陆页面index.jsp,成功登陆的,直接跳转到url指定的路径上。
目录结构如下:
|
|--index.jsp (登陆页面)
|
|---WEB-INF
|
|--web.xml (添加过滤器配置 )
|--manager
| |
| |---test1.html
| |---test2.html
|
src——MyFilter.java( implements Filter) (过滤器处理类)
关键代码: 1.web.xml (配置过滤器)
...
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.temp.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/manager/*</url-pattern>
</filter-mapping>
...
2.MyFilter.java(过滤器处理类)
...
//实现接口Filter的doFilter(..)方法
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest)request;
HttpServletResponse hres = (HttpServletResponse)response;
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
//用户登陆
if(user!=null&&pwd!=null&&user.equals("admin")&&pwd.equals("admin")){
hreq.getSession().setAttribute("user", "1");
}
//获取Session
String flag = (String)hreq.getSession().getAttribute("user");
if(flag==null){
//重新登陆
hres.sendRedirect("/myproject/index.jsp");
}else{
//跳转到指定的html文件
chain.doFilter(hreq, hres);
}
}
...