Web应用安全控制

Acegi Security Taglib 0.6.1: Web应用安全控制实践 本文还有配套的精品资源,点击获取 简介:Acegi Security Taglib 0.6.1是一个为Web应用提供安全控制的开源库,集成了Acegi Security的自定义HTML标签。通过这些标签,开发者可以在JSP页面中轻松实现权限检查、用户登录状态显示等安全功能,提高代码的可读性和维护性。本库已被Spring Security取代,但对旧项目的维护仍有参考价值。开... 阅读详情

本内容摘自《Java Web程序设计基础教程》

第13章 系统安全控制

 

 


目标:

u       掌握使用登录功能对系统的用户进行认证;

u       掌握如何控制只有具有相应权限的用户才可以访问相应的资源;

u       掌握如何控制页面中的部分功能只能在特定的情况下才能使用;

u       掌握如何对多个文件的安全同时进行控制;

u       了解验证码的工作原理。

网站的很多功能是普通用户不能访问的,例如添加图书这样的功能只能由管理员完成,普通用户是无法访问的,如果普通用户要访问,应该提示普通用户没有相应的权限。本章介绍如何控制用户的权限。

13.1 完善登录功能

第4、5、6章中介绍的登录功能只是简单的模拟,现在对该功能进行完善。

13.1.1 功能描述

用户在登录界面输入用户ID和口令,系统根据用户输入的用户ID和口令进行处理:

l         用户ID和口令都正确,并且当前用户是管理员,则跳转到管理员的默认界面。

l         如果用户ID和口令正确,并且是普通用户,则跳转到普通用户的默认界面。

l         如果用户ID和口令不正确,则重新转向登录界面。

不管是管理员还是普通用户,登录之后的默认界面应该是用户使用频率最高的界面。如果网站比较智能,可以对用户的访问进行统计,为用户显示经常使用的界面,或者上次访问的界面。对于管理员来说,使用频率最高的功能应该是订单管理,所以应该把订单管理作为管理员的默认界面。对于普通用户来说,使用频率最高的功能应该是图书查看,所以应该把图书查看界面作为普通用户的默认界面。

13.1.2 思路分析

仍然采用MVC模式来设计该功能。

首先是M部分,可以使用UesrBean中原有的方法findUserById。

其次是V部分,登录界面在前面已经完成,图书查看功能是读者在前面实训中完成的功能,假设为findBooks,订单管理是下一章将要完成的实训内容,假设为findOrders。

最后是C部分,获取用户输入的用户ID和口令,根据ID调用模型的findUserById方法,根据返回值进行处理:

u       如果返回值为null,则说明用户不存在;

u       否则,判断口令是否匹配:

n         如果不匹配,说明口令不正确;

n         如果匹配,判断用户的类型:

u       如果用户类型为1,说明该用户为管理员;

u       否则为普通用户。

13.1.3 修改登录控制器Servlet

根据上面的分析,修改后的控制器的代码如下:

package bookstore.servlet;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import bookstore.bean.*;

 

public class LoginServlet extends HttpServlet

{

   public void doGet(HttpServletRequest request,HttpServletResponse response)

      throws IOException,ServletException   {

 

      // 获取用户提交的信息

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

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

 

      // 创建JavaBean对象

      UserBean ub = new UserBean();

     

      // 转向的文件

      String forward=null;

      // 提示信息

      String info=null;

 

      UserBean user=ub.findUserById(userid);

 

      // 用户不存在

      if(user == null){

         forward="login.jsp";

      }

      // 口令不正确

      else if(!user.getUserpass().equals(userpass)){

         forward="login.jsp";

      }

      // 管理员

      else if(user.getType().equals("1")){

         forward="findOrders";

      }

      // 普通用户

      else{

         forward="findBooks";

      }   

 

      // 定义跳转文件

      RequestDispatcher rd=request.getRequestDispatcher(forward);

      // 完成重定向

      rd.forward(request,response);

   }

   public void doPost(HttpServletRequest request,HttpServletResponse response)

      throws IOException,ServletException  {

      doGet(request,response);

   }

}

13.2 用户管理的安全控制

13.2.1 功能描述

只有管理员可以使用图书添加功能,如果用户没有登录,提示用户“您还没有登录,请先登录!”,如果当前用户是普通用户,提示用户“您不是管理员,不能添加用户”。如果当前用户是管理员,则显示添加界面。

13.2.2 运行效果

首先,直接访问图书添加的页面,得到如图13.1所示界面。

 

图13.1 没有登录的提示界面               图13.2 没有权限的提示界面

然后,点击“登录”超链接跳转到登录界面,输入普通用户的ID和口令,然后再访问图书添加界面,得到如图13.2所示界面。

然后,点击“登录”超链接跳转到登录界面,输入管理员用户ID和口令,然后再访问图书添加界面,得到如图9.1所示的用户添加界面。

13.2.3 思路分析

要防止这个文件被没有权限的人访问,必须对每个访问这个文件的人的身份进行验证,要想知道当前用户的权限,在登录的时候必须记录当前用户的权限。

在访问这个文件的时候,首先应该从session中获取用户信息,如果用户不存在,跳转到“没有登录”的提示界面,如果用户是普通用户,跳转到“没有权限”的提示界面,不让用户访问当前页面,这样就保证了当前页面的安全。

为了方便用户的操作,需要在信息提示页面增加到登录页面的超链接。

13.2.4 操作session

使用session对象能够在多个页面之间共享信息,在Servlet中也可以使用session对象,但是与在JSP中不同,在JSP中session对象是内部对象,在Servlet中需要先获取session对象。要完成安全控制需要使用session对象保存用户信息,下面介绍关于session的常用操作。

获取session对象

session对象存储在request对象中,request对象也就是服务类方法的第一个参数,可以使用HttpServletRequest的下面的方法来获取session对象:

HttpSession getSession(boolean);

通常是在doGet方法或者doPost方法中,通过第一个参数request来获取。代码如下:

HttpSession session;

session =request.getSession(true);

在session中存储信息

获取session对象之后,如果希望在session中存储信息,可以使用下面的方法:

session.setAttribute("name",value);

用于在session中保存信息,有两个参数,第一个参数是字符串,是要存储信息的名字,第二个参数是保存的值本身,可以是各种类型的对象。如果第一个参数所指定的名字存在,会替换该名字原来对应的值;如果第一个参数所指定的名字不存在,会把第二个参数指定的值存储到session中。

从session中获取信息

如果要从session中获取已经保存的信息,可以使用下面的方法:

session.getAttribute("name");

参数就是要获取的信息的名字。在使用的时候对得到的信息必须进行强制类型转换,因为方法的返回值类型是Object。例如在session中存储的是String对象,要得到这个对象,可以使用下面的代码:

String str = (String)session.getAttribute("name");

删除session中存储的信息

如果要删除session中的某个信息,可以使用下面的方法进行删除:

session.remove("name");

参数就是要删除的session中的对象的名字。

使session失效

如果不想使用session了,可以使用下面的方法:

session.invalidate()

使用该方法之后,就不能继续使用session了,包括session中的所有信息。

13.2.5 修改登录处理的代码

在登录成功之后,把用户信息保存到session中。因为这个信息是与特定用户相关的,在用户的整个访问过程中都有效。

在Servlet中首先要获取session对象,在用户登录成功之后,把用户对象保存到session中。修改后的Servlet的代码如下:

package bookstore.servlet;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import bookstore.bean.*;

 

public class LoginServlet extends HttpServlet

{

   public void doGet(HttpServletRequest request,HttpServletResponse response)

      throws IOException,ServletException   {

 

      // 获取用户提交的信息

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

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

 

      // 创建JavaBean对象

      UserBean ub = new UserBean();

     

      // 转向的文件

      String forward=null;

      // 提示信息

      String info=null;

 

      // 得到session对象

      HttpSession session;

      session =request.getSession(true);

 

      UserBean user=ub.findUserById(userid);

 

      // 用户不存在

      if(user == null){

         forward="login.jsp";

      }

      // 口令不正确

      else if(!user.getUserpass().equals(userpass)){

         forward="login.jsp";

      }

      // 管理员

      else if(user.getType().equals("1")){

         session.setAttribute("login",user);

         forward="findOrders";

      }

      // 普通用户

      else{

         session.setAttribute("login",user);

         forward="findBooks";

      }   

 

      // 定义跳转文件

      RequestDispatcher rd=request.getRequestDispatcher(forward);

      // 完成重定向

      rd.forward(request,response);

   }

   public void doPost(HttpServletRequest request,HttpServletResponse response)

      throws IOException,ServletException  {

      doGet(request,response);

   }

}

13.2.6 在用户添加界面增加控制

在原来的添加界面的代码中,增加对用户是否登录已经是否有相应的权限的判断。判断过程如下:

u       从session中获取“login”对象,如果不存在表示没有登录,转向需要登录的提示界面;

u       如果用户存在,并且是普通用户,转向没有权限的提示界面;

u       如果是管理员,继续向下执行即可。

用于判断的代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!--判断session中是否存在login-->

<c:if test="${empty login}">

   <!--跳转到需要登录的提示界面-- >

   <jsp:forward page="needlogin.jsp"/>

</c:if>

<!--判断session中用户是否是管理员-->

<c:if test="${login.type==0}">

   <!--跳转到没有权限的提示界面-->

   <jsp:forward page="noright.jsp"/>

</c:if>

把这段代码添加到addUser.jsp页面的前面即可。

13.2.6 对控制器进行安全控制

上面完成了对添加用户的界面的安全控制,这样如果不是管理员就不能访问这个界面了。好像已经完成了安全控制,事实是不是这样呢?

添加用户的过程是:在添加界面输入用户信息,提交给控制器处理,控制器调用业务方法完成添加过程。如果用户直接访问控制器怎么办?因为控制器是Servlet,是允许访问的。

有人会说虽然可以访问,但是没有用户信息,仍然不能添加。实际上,可以通过问号传递参数,效果与表单提交完全相同。在前面讲分页显示的时候,页码就是通过问号传递的。所以要想保证用户添加功能的安全,还需要对控制器进行安全控制。

在控制器中进行安全控制,主要的过程:

u       从session中获取登录信息

u       然后对登录信息进行判断:

n         如果为null,说明用户没有登录,跳转到“需要登录”的提示界面;

n         如果不为null,并且type为0说明是普通用户,跳转到“没有权限”的提示界面。

修改添加用户的Servlet,在doGet方法的最前面添加如下代码:

      // 得到session对象

      HttpSession session;

      session =request.getSession(true);

  

      // 从session中获取登录信息

      UserBean login = (UserBean)session.getAttribute("login");

      // 判断登录信息

      if(login==null || login.getType().equals("0")){

         response.sendRedirect("login.jsp");

      }

这样,添加用户的页面和添加用户的控制器全都控制了。

13.3使用过滤器进行安全控制

除了上面介绍的方法之外,JSP还提供了一种比较方便的方式能够很好的解决安全问题。这种方式是Servlet过滤器,它的特点是可以对用户的请求进行过滤,也可以过滤对用户的响应。相对于前面的处理方式,使用过滤器可以不用修改要进行安全控制的功能文件。下面介绍如何使用过滤器完成添加功能的安全控制。

13.3.1 Servlet过滤器简介

Servlet过滤器是特殊的Servlet,Servlet过滤器可以对用户的请求信息和响应信息进行过滤,当我们访问Servlet过滤器所对应的Servlet的时候,会先执行Servlet过滤器,对请求和响应的信息进行过滤。

可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL的时候,才会触发过滤器工作。

独立的Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象。每个Servlet完成不同的过滤功能。

13.3.2 创建Servlet过滤器

所有Servlet过滤器类必须实现javax.servlet.Filter接口,同时需要继承HttpServlet。

接口中的主要方法有:

init(FilterConfig):初始化方法,Servlet容器创建Servlet过滤器实例后调用这个方法,可以读取web.xml 文件中Servlet过滤器的初始化参数;

doFilter(ServletRequest,ServletResponse,FilterChain):完成实际的过滤操作,参数FilterChain用于访问后续的过滤器;

destory():在销毁过滤器实例前调用该方法。

下面的实例LoginFilter.java完成对Servlet:Login.java的过滤。

package bookstore.servlet;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

 

public class AddUserFilter extends HttpServlet implements Filter {

   private FilterConfig filterConfig;

 

   public void init(FilterConfig filterConfig) {

      this.filterConfig = filterConfig;

   }

 

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {

      // 得到session对象

      HttpSession session;

      session =request.getSession(true);

  

      // 从session中获取登录信息

      UserBean login = (UserBean)session.getAttribute("login");

      // 判断登录信息

      if(login==null || login.getType().equals("0")){

         response.sendRedirect("login.jsp");

      }

 

      // 继续调用其它的过滤器

      try {

         filterChain.doFilter(request, response);

      }

      catch(Exception e) {

      }

   }

 

   public void destroy() {

   }

}

在doFilter方法中,前两个参数就是包含请求信息和响应信息的request和response对象。处理过程与前面介绍的验证过程相同。

13.3.3 配置过滤器

和Servlet一样,过滤器需要在web.xml中配置。过滤器的配置也包括两个方面:第一是Servlet过滤器的声明,第二是配置Servlet过滤器对应的URL。

首先是Servlet过滤器的声明,通过<filter>元素声明

<filter>

 <filter-name>过滤器名字</filter-name>

 <filter-class>过滤器类名</filter-class>

 <init-param>

   <param-name>参数名</param-name>

   <param-value>参数值<param-value>

 </init-param>

</filter>

其中,filter-name确定过滤器的名字,filter-class确定过滤器对应的类名,如果使用参数,通过init-param元素来声明。

上面的LoginFilter可以使用下面的代码声明:

<filter>

 <filter-name>addUserFilter</filter-name>

 <filter-class> bookstore.servlet.AddUserFilter</filter-class>

</filter>

然后是Servlet过滤器的映射,与url进行关联,通过<filter-mapping>元素声明

  <filter-mapping>

    <filter-name>过滤器名字</filter-name>

    <url-pattern>访问路径</url-pattern>

  </filter-mapping>

其中,filter-name是过滤器的名字,url-pattern是关联的url,当我们访问这个url时候,会触发该过滤器,需要保证这里的filter-name和filter元素中的filter-name一致。上面的addUserFilter是对AddUserServlet的过滤,应该配置如下:

  <filter-mapping>

    <filter-name>addUserFilter</filter-name>

    <url-pattern>/addUser</url-pattern>

  </filter-mapping>

通过这样的配置之后,在AddUserServlet中就不用进行配置了。

13.4 采用专门的安全控制页面

上一节采用的方式能够解决用户添加页面的安全问题,但是网站上存在大量的需要进行安全控制的页面,如果在每个界面添加这样一段代码,不仅需要很大的工作量,而且后期的维护会很麻烦,也不符合我们软件工程中的代码共享思想。既然每个页面都要使用这样的功能,并且这样的功能在每个文件中是相同的,能不能把它们放在一个专门的文件中,需要的时候再去调用这个文件?JSP中提供了相应的解决方法,本节的内容就是要解决这个问题的。

13.4.1 编写专门文件

首先把验证的代码专门放在一个文件中,把这个文件命名为checkuser.jsp,文件的代码如下:

<%@ page contentType="text/html;charset=gb2312"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!--判断session中是否存在login-->

<c:if test="${empty login}">

   <!--跳转到需要登录的提示界面-->

   <jsp:forward page="needlogin.jsp"/>

</c:if>

<!--判断session中用户是否是管理员-->

<c:if test="${login.type==0}">

   <!--跳转到没有权限的提示界面-->

   <jsp:forward page="noright.jsp"/>

</c:if>

13.4.2 修改图书添加界面代码

然后删除图书添加界面中的安全控制代码,在原来的安全控制代码所在位置使用指令引入这个专门的验证文件,这个包含指令的格式如下:

<%@ include file="目标文件"%>

语法格式与page指令非常类似,开始标志和结束标志相同,使用file属性指定目标文件。它的作用是把目标文件的内容拷贝到标签所在的位置,然后形成一个文件,在运行的时候只有一个文件存在。

在本例中,需要在图书添加界面中调用这个共享的文件,代码如下:

<%@ include file="checkuser.jsp"%>

思考:如果要在控制器中共享安全控制的代码,如何实现?

13.4.3 <jsp:include>标签和<%@ include %>指令

从字面意思看,两者都有包含的意思,并且从运行的结果上来看,两者的功能也非常类似,但是两者的运行过程相差很大。

<%@ include%>指令是编译时语法,也就是在编译的时候,把指令所指向的目标文件的内容拷贝到指令所在的位置,替换指令,最终形成一个文件,在运行的时候只有一个文件。

<jsp:include>动作是运行时语法,包含<jsp:include>动作的文件在执行到这个标签的时候,会转向执行标签所指向的目标文件,执行完目标文件之后,再接着执行标签后的内容,在运行的时候,涉及到两个文件,就像方法调用一样。

那么什么时候应该使用<%@ include%>指令,什么时候使用<jsp:include>标签呢?因为<%@ include%>指令是静态的,而<jsp:include>是动态的,所以如果某一段代码肯定会执行,则可以使用<%@ include%>指令,如果某一段代码有可能执行,有可能不执行,需要根据运行时候的状态,这时候可以使用<jsp:include>。

在实际应用中,很多网站的导航部分和版权信息部分都是相同的,就像上面的验证过程一样,在每个文件中都会出现,所以可以考虑把这些内容放在单独的文件中,然后使用<%@ include%>指令引用使用。

13.5 进行集中的安全控制

前面介绍的安全控制方式,不管是针对JSP文件,还是针对Servlet,都是针对每个文件的。实际上,所有的管理功能都需要进行相同的验证。如果能进行集中的安全控制,就不用为每个功能文件编写安全控制的代码,这样就简单多了。

要进行集中的安全控制,可以使用前面介绍的过滤器。对添加功能中的Servlet进行控制的过滤器部分配置代码如下:

  <filter-mapping>

    <filter-name>addUserFilter</filter-name>

    <url-pattern>/addUser</url-pattern>

  </filter-mapping>

<url-pattern>指出对那个功能进行控制。在<url-pattern>中可以使用通配符*,例如下面的代码:

  <filter-mapping>

    <filter-name>addUserFilter</filter-name>

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

  </filter-mapping>

可以对所有的请求进行过滤。

在bookstore应用中,并不是所有的功能都需要进行安全控制,例如,登录界面。那么如何能够方便的控制需要进行安全控制的功能呢?可以让具有相同访问权限的功能具有相似的访问方式,例如与管理相同的功能的访问路径都是以manager(除了应用路径http://127.0.0.1:8080/bookstore之外)开始的。

可以把所有管理员才能访问的页面放在“manager”文件夹中,所有管理员才能访问的Servlet的<url-pattern>都写成“manager/*”的方式。然后配置过滤器的<url-pattern>的时候可以写成:

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

具体的过滤器的编写与前面介绍的完全相同。通过这样的配置,就可以控制所有管理员的功能只能被管理员使用。

13.6 页面的局部安全要求

在bookstore的图书信息察看功能中,如果是普通用户只能查看图书信息,不能删除和修改图书信息,如果是管理员不仅可以查看图书信息,还可以删除和修改图书信息。这样就会产生下面的问题:普通用户能够访问图书信息察看界面,但是不能使用界面上的删除和修改功能。使用前面介绍的安全控制方法就不能解决了,需要对页面的局部进行安全控制。选择业面中的删除功能进行控制。

删除功能的代码如下:

            <form action="deleteBoo" method="post"

                  onSubmit="return confirm('真的要删除该图书吗?');">

               <input type="hidden" name="bookid" value="${book.bookid}">

               <input type="submit" value="删除">

            </form>

使用<c:if>标签判断用户是否是管理员,如果是显示上面的代码,如果不是则不显示,修改后的代码如下:

<c:if test="${(!empty login) && login.type==1}">

            <form action="deleteUser" method="post"

                  onSubmit="return confirm('真的要删除该用户吗?');">

               <input type="hidden" name="userid" value="${user.userid}">

               <input type="submit" value="删除">

            </form>

</c:if>

13.7 增加图形验证码

在很多网站中为了安全,都在登录的时候使用图形验证码,接下来简单介绍图形验证码的作用和实现原理。

13.7.1 图形验证码的作用

在原来Web应用的登录功能中,主要是通过对输入的用户名和口令进行验证。如果不法分子知道了某个用户的用户名,但是不知道口令,他可以试验所有的组合,最后肯定能找出口令。随着计算机计算能力的提高,通过试验来猜测口令就变的非常简单了。

为了增加口令被破解的难度,提出了图形验证码。增加图形验证码之后,对于普通用户来说,在使用的时候需要多输入一项信息,而对于口令的破解者来说,需要先识别这些验证码(一般比较困难),更重要的是这个验证码每次都变化,这样口令被破解几乎不可能。

13.7.2 图形验证码的实现原理

基本工作原理就是在用户登录界面上以图形的方式显示一些符号,通常是字母和数字,并且这些符号是随机生成的。用户把这些图形码的信息再输入到输入框进行验证。

如何进行验证呢?系统需要保存图形码对应的信息,然后与用户输入的信息进行匹配。信息可以保存在客户端也可以保存在服务器端,相对来说放在服务器端比较安全。

如果要保存在客户端,可以使用隐藏域或者类似的机制保存,但是如果直接保存,容易让口令的破解者获取到,所以通常会加密。

如果保存在服务器端,可以把它保存在session中,在服务器端进行匹配。

小结

Web应用的安全主要是通过用户在登录网站的时候提供用户名和口令来解决。为了防止用户恶意攻击,还可以采用与图形码相结合的方式。

因为在用户后续的访问过程中,仍然需要对安全进行处理,但是不能要求用户在每个页面都输入用户名和口令,所以需要保存用户信息。所以在登录的时候需要把用户信息保存在session中。

不仅需要控制界面的安全,更重要的是要控制Servlet的安全。可以采用共享文件来完成所有的安全控制。

也可以使用过滤器完成安全控制,并且可以通过通配符进行集中的安全控制。

如果页面中的某个功能需要进行访问控制,可以在页面中添加安全控制的代码。

习题

1、  为了在以后的访问过程中,使用用户信息,可以把用户信息保存在以下什么对象中?

A)application        B) session         C)request         D)pageContext

2、  用户通过输入框输入用户名,假设输入框的名字是username,希望把用户输入的用户名保存到session中,应该如何编写代码?

3、  要判断用户输入的用户名ueername和口令userpass是否相同,如何判断?

4、  在session中保存了用户的权限,使用的名字是degree,如果degree的值是1表示用户是管理员,如果degree的值是0表示用户是普通用户。请据此编写代码输出用户的身份。

5、  需要把a.jsp中的内容显示在b.jsp文件中,请使用<%@ include%>标签完成。

6、  用户名保存在session中,要输出用户名,写出相应的代码。

7、  简述<%@ include%>标签与<jsp:include>动作的相同点和不同点。

Zotero+WPS文献引用跳转功能缺失?3分钟教你用VBA宏搞定(附完整代码) 本文针对WPS用户使用Zotero时文献引用无法点击跳转的痛点,提供了一套完整的VBA宏解决方案。通过解析Zotero的域代码,自动在文内引用和文末参考文献之间创建超链接,实现一键跳转,极大提升了学术写作与文献查阅的效率。 阅读详情

相关推荐

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

SendRedirect和forward的区别

(1)重定向是JSP中实现JSP/Servlet程序跳转至目标资源的方法之一,它的基本思想是:服务器将目标资源完整的URL通过HTTP 响应报头发送给客户端浏览器,浏览器接收到URL后更新至地址栏中,并将目标资源的URL提交给服务器。重定向使目标资源的 URL从服务器传到客户端浏览器,再从客户端通过HTTP请求传回服务器,其中有一定的网络时延。  (2)实现JSP页面跳转的主要方法有

徐刘根的博客 3003

AutoCAD二次开发(.Net)之XData

对于CAD中的实体进行筛选等操作,常常会用到实体的XData属性,下面介绍一下实体的XData的增删改。 //XData的新增,修改跟新增一样,new一个ResultBuffer,赋值即可 Document doc=Application.DocumentManager.MdiActiveDocument; using (DocumentLock dl = doc.LockDocument()) { using (Transaction trans = doc.TransactionManager.S.

qq_21489689的博客 2593

Spring security安全登录-当AJAX遇上Redirect

Spring security安全登录-当AJAX遇上Redirect前言:最近做平台引入spring security做为安全认证框架,在登录的时候使用的ajax的请求方式,最开始的做法是调用登录的接口,成功后再前端使用`window.location.href = ./index.html`的方式跳转到希望的页面,考虑到以后会根据用户的权限做页面的跳转,就打算在后台做成功页面的跳转,这个时候想到

Aubergines的专栏 1655

华为设备OSPF配置全流程:从邻居关系到区域划分实战指南

本文详细介绍了华为设备上OSPF协议的完整配置流程,从基础概念到实战操作,包括邻居关系建立、多区域划分及高级特性配置。特别针对华为设备的特有语法和验证命令进行了重点讲解,帮助网络工程师快速掌握OSPF在华为环境中的部署与优化技巧,提升网络配置效率。

weixin_29299807的博客 251

Applied Energy期刊小白论文投稿模板-流程经验分享

Applied Energy期刊小白论文投稿模板-流程经验分享,Elsevier期刊(爱思唯尔)投稿流程

zzu_Flyer的博客 4万+

response.sendRedirect使用注意事项 .

response.sendRedirect使用注意事项 . 问题:最近在调试xwiki的时候遇到java.lang.IllegalStateException异常,解决方案:在response.sendRedirect("")方法后加return;语句即可:原因是在程序中两次调用response.sendRedirect("")方法 jdk5.0文档中很清楚地介绍了出现IllegalStateE...

weixin_34343308的博客 320

树冠体积计算之体元累加法

因为是自己之前研究的一个方向,就复现了一下论文中的这个方法,在此正好记录一下。 文章目录一、简介二、代码实现(MATLAB)三、小结 一、简介 简而言之,其实就是一句话,即以固定大小的体元模拟不规则的树冠形状。按照论文中的思路主要就是将树冠沿树高方向以 k 为步长进行等距离分段,把每一段树冠的点投影到垂直于树高方向的平面上,再对该平面划分成大小为 k × k 的像元,根据投影到各个像元内点的数量,判断该像元的有效性,统计有效像元的数量 T,则树冠体积为 T 个 k × k × k 的体元之和。如下图所示:

dayuhaitang1的博客 2607

response.sendRedirect所引发的问题及解决

在servlet跳转到 jsp 中,有时使用response.sendRedirect(request.getContextPath()+"/login.jsp"); 跳转到登录页面,却发现没有任何样式和图片。 因为“当前路径”这个概念在J2EE中是不稳定的。 所以最好都是绝对路径,类似于:     这句放JSP页面开头   /images/xxoo.jpg" />  后面都类似这么写

万豪给给的博客 9311

从零到一,打造你的无人机侦察兵!树莓派+Python+MQTT,实时目标检测全攻略

物联网、人工智能与计算机视觉三大前沿技术的深度融合。

u013558123的博客 1473

Universal Robot——在Gazebo中模拟UR5机器人

今天的目标是在Gazebo安装我们的ur5机器人。Gazebo是一个流行的模拟工具,它不仅可以让你像在Rviz中一样可视化你的机器人,而且还内置了一个物理引擎。这样你就可以在更真实的环境中测试你的机器人应用程序。我们将查看我们需要的属性 添加对我们的机器人——我们的order的描述,以模拟它以及如何在Gazebo中生成我们的机器人。

如果想成为中心,那么就到中心去吧。 1969

web应用安全控制

安全控制流程

sdaujsjczh的专栏 262

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

Spring Security Web应用安全控制:保护你的应用程序

Spring Security是一个功能强大且高度可定制的Java安全框架,用于保护基于Spring的应用程序。Spring Security是一个功能全面且灵活的安全框架,适用于各种规模的Web应用。通过本文的学习,你应该能够掌握Spring Security的基本操作,并开始在你的项目中使用Spring Security进行安全控制。

2201_75568026的博客 470

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

是否对Web应用的Web服务器和应用服务器之间的通信进行了安全控制?

配置Web服务器时需要对来自不同区域的请求进行限制以实现访问控制:```shell根据上述实践方法,用户在Web服务器及应用服务器间的通信过程中可以实现有效的安全控制措施包括访问控制、WAF防护以及数据传输加密等方面内容从而提高了系统的整体安全性。不过值得注意的是这些仅仅是一些基本的防护措施在实际应用场景中可能还需要结合其他技术手段和管理流程才能更好地满足复杂多变的安全需求例如实时监控报警和应急响应计划等内容需要配套完善以确保系统的安全稳定运行。

ZOMO的博客 416

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

是否对Web应用的Cookie和Session管理实施了安全控制?

*什么是Cookie?**Cookie 是指网站服务器为每个用户创建的一种小型文本文件(通常只有几KB大小),并将其存储在使用 Cookie 的用户的浏览器上。当用户访问同一网站时,该网站便可通过 Cookie 识别不同的用户并保存他们的设置信息 (如购物车等)。**Cookie有哪些特点?**1. 保存在客户端:Cookie 存储于用户的浏览器端而非服务器端,这使得用户无需重新登录即可继续之前的活动状态。

ZOMO的博客 1140

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

web网站的安全控制

加密机制:加密是保护数据在传输和存储过程中安全性的核心技术。通过对数据进行加密,可以确保只有拥有解密密钥的授权用户可以访问和读取数据。常见的加密算法包括对称加密(如AES)和非对称加密(如RSA)。数字签名机制:数字签名用于验证数据的完整性和来源。通过使用私钥对数据进行签名,接收方可以使用公钥验证签名的有效性,从而确保数据在传输过程中没有被篡改,并且确实来自声称的发送方。身份认证机制:身份认证是确认用户或实体身份的过程。

migo_的专栏 1247

ASP.NET应用程序安全控制的作用及原理

作为Web服务器,就是向浏览者友好的提供反馈信息。如果访问者按照网络服务的规则,以合理身份和合理的权限提交数据访问请求,那么交互关系就会显得顺理成章。但是事实上并非这么简单,正如世界上的交通一样,并非所有的车辆都是按照规定行道来行驶,总会有些有意无意的访问是不合规则(不合法)的。因此网络应用程序安全问题显得尤为重要。   我们知道Web应用程序提供的服务是可以通过世界上任意一台可以连到互联网的计

The key to .Net 311

Spring Boot中使用Spring Security进行安全控制

我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架实现(如:Apache Shiro、Spring Security)。 本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制。 准备工作 首先,构建一个简单的Web工程,以用于后续...

优秀的判断力来自经验,但经验来自于错误的判断 251

使用 Smart Security 实现安全控制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34050519的博客 457

Shiro与其他Java安全框架(如Spring Security)相比,有哪些优势和劣势?在一个典型的Java Web应用程序中,你如何集成Shiro来实现安全控制?

综上所述,Shiro和Spring Security各有优劣,选择哪个框架取决于项目的具体需求、团队的技术栈以及对安全性的要求。首先,你需要在你的Java Web项目的构建配置中(例如Maven的pom.xml或Gradle的build.gradle)添加Shiro的依赖。这样,你的项目就可以使用Shiro提供的类和方法了。与Spring框架的深度集成:Spring Security是Spring框架的一部分,与Spring的其他组件(如Spring MVC)能够无缝集成,提供了更好的一致性和便利性。

Aaron的博客 2189
上一篇: 对Struts2中控制器的一点改进建议
下一篇: 404错误的调试
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值