J2EE 第三周作业

1.关于用户授权的Filter例子

在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法:

LoginFilter.java

复制代码 代码如下:
public class LoginFilter implements Filter {
private String permitUrls[] = null;

private String gotoUrl = null;

public void destroy() {

// TODO Auto-generated method stub

permitUrls = null;

gotoUrl = null;

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

// TODO Auto-generated method stub

HttpServletRequest res=(HttpServletRequest) request;

HttpServletResponse resp=(HttpServletResponse)response;

if(!isPermitUrl(request)){

if(filterCurrUrl(request)){

System.out.println("--->请登录");

resp.sendRedirect(res.getContextPath()+gotoUrl);

return;

}

}

System.out.println("--->允许访问");

chain.doFilter(request, response);

}

public boolean filterCurrUrl(ServletRequest request){

boolean filter=false;

HttpServletRequest res=(HttpServletRequest) request;

User user =(User) res.getSession().getAttribute("user");

if(null==user)

filter=true;

return filter;

}

public boolean isPermitUrl(ServletRequest request) {

boolean isPermit = false;

String currentUrl = currentUrl(request);

if (permitUrls != null && permitUrls.length > 0) {

for (int i = 0; i < permitUrls.length; i++) {

if (permitUrls[i].equals(currentUrl)) {

isPermit = true;

break;

}

}

}

return isPermit;

}

//请求地址

public String currentUrl(ServletRequest request) {

HttpServletRequest res = (HttpServletRequest) request;

String task = request.getParameter("task");

String path = res.getContextPath();

String uri = res.getRequestURI();

if (task != null) {// uri格式 xx/ser

uri = uri.substring(path.length(), uri.length()) + "?" + "task="

+ task;

} else {

uri = uri.substring(path.length(), uri.length());

}

System.out.println("当前请求地址:" + uri);

return uri;

}

public void init(FilterConfig filterConfig) throws ServletException {

// TODO Auto-generated method stub

String permitUrls = filterConfig.getInitParameter("permitUrls");

String gotoUrl = filterConfig.getInitParameter("gotoUrl");

 

this.gotoUrl = gotoUrl;

 

if (permitUrls != null && permitUrls.length() > 0) {

this.permitUrls = permitUrls.split(",");

}

}

}


Web.xml

复制代码 代码如下:

<filter>

<filter-name>loginFilter</filter-name>

<filter-class>filter.LoginFilter</filter-class>

 

<init-param>

<param-name>ignore</param-name>

<param-value>false</param-value>

</init-param>

<init-param>

<param-name>permitUrls</param-name>

<param-value>/,/servlet/Loginservlet?task=login,/public.jsp,/login.jsp</param-value>

</init-param>

<init-param>

<param-name>gotoUrl</param-name>

<param-value>/login.jsp</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>loginFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

2.了解session

session的用法

session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

bsession的原理

session的工作原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
Session 是 用于保持状态的基于 Web服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。
Session 通常用于执行以下操作
存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。
存储只需要在页重新加载过程中或按功能分组的一组页之间保持其状态的对象。
Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。
持久性方法的限制
随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加。
访问 Web应用程序的每个用户都生成一个单独的 Session 对象。每个 Session 对象的持续时间是用户访问的时间加上不活动的时间。
如果每个 Session 中保持许多对象,并且许多用户同时使用 Web应用程序(创建许多 Session),则用于 Session 持久性的服务器内存量可能会很大,从而影响了可伸缩性。
3.关于异步处理
3.异步处理
所谓异步处理就是指数据发送方发送数据给数据接收方后,不必等待数据接收方作出响应,可以继续发送下一个数据的通信方式。

Servlet 3.0版本提供了相关异步处理的功能,具体实现方式如下:

需要使用注解在对应Servlet配置asyncSupported=true,表示当前Servlet支持异步。
通过Request对象的startAsync(Request, Response)方法获取异步上下文对象。
通过异步上下文对象调用start(new Runnable(){})方法开始异步处理,Runnable类的run()方法提供具体异步的逻辑代码。
根据上述步骤,通过一个代码实例演示。

@WebServlet(urlPatterns="/async",asyncSupported=true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException {
// 设置响应类型及编码格式
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("马上开始:<br/>");
// 刷新缓冲区
resp.getWriter().flush();
// 获取异步上下文对象
final AsyncContext ac = req.startAsync(req, resp);
// 开始异步处理
ac.start(new Runnable() {
@Override
public void run() {
try {
for (char ch = 'A'; ch <= 'Z'; ch++) {
resp.getWriter().print(ch);
resp.getWriter().flush();
Thread.sleep(250);
}
// 表示异步处理完毕
ac.complete();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
}

posted on 2018-04-01 20:36  沈沈沈  阅读(113)  评论(0编辑  收藏  举报