zoukankan      html  css  js  c++  java
  • JavaWeb 基础面试

    1. 启动项目时如何实现不在链接里输入项目名就能启动?  

      修改Tomcat配置文件 server.xml。找到自己的项目配置 :

    <Context docBase="oneProject" path="/one Project" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

      改为如下配置:

    <Context docBase="oneProject" path="/" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

       经过这样的修改,项目就可以在启动服务器后不用输入项目访问了。

    2.  1分钟之内只能处理1000个请求,你怎么实现,手撕代码?

      我知道的有两种方式可以实现:

        a). Application 对所有用户访问的次数计数。同时定义一个计时器,单位为一分钟。如果Application 中的用户在单位时间内超出请求次数,就拒绝处理该请求。一分钟再刷新application的值为0.

          使用一个Map 维护变量:

    // 泛型 String 表示用户标识,List中存放用户不同请求的时间戳。
    private Map<String, List<Long>> map = new ConcurrentHashMap<>();

        我们只需要在单位计数中判断 List中数量是否超出限制即可。

        b). 使用 aop 实现请求的限制,在需要限制的请求方法上加上 aop 逻辑。即可实现,思路如下:

          自定义注解类实现请求限制的拦截逻辑,在需要限制的方法上使用注解,超出限制后拒绝处理请求。

    3. 什么时候用assert

      在开发和测试过程中,很多时候我们需要对某些场景进行判断,当这个判断满足我们预期的答案,才继续往下执行,否则提出程序或者发出警告。assert就是这样的功能,满足判断时返回true,否则返回false。但是真正到系统上线的时候,这些assert是不要使用的。

    4.  java 应用服务器有哪些?

      Java 的应用服务器很多,从功能上分为两大类,JSP 服务器和 Java EE 服务器,也可分其他小类。相对来说 Java EE 服务器的功能更加强大。我平时就用Tomcat。

    JSP 服务器有 Tomcat 、Bejy Tiger 、Geronimo 、 Jetty 、Jonas 、Jrun 、Orion 、Resin
    Java EE 服务器有TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、JBoss、开源GlassFish。(来源自百度百科)
     
    5. 说一说四种会话跟踪技术。
    a).表单隐藏域
      
    <input type="hidden" id="xxx" value="xxx">

     在表单的提交中,加入这样一段数据提交的隐藏域,用户在输入时是看不到的,但是可以通过查看网页源代码来看到,在服务端只能通过post的方式获取参数。这种方式在禁用Cookie的情况下也能工作,但是关闭浏览器后就会失效。

    b).URL重写
    http://www.XXX.com/news?id=xxxx
    在提交请求的URL后面加上请求需要的参数,常见的GET的请求。安全性能不高,参数可以在地址栏中看到,而且对于参数的长度有限制(1024字节),禁用Cookie的情况下也能使用,但是关闭浏览器后就会失效。
     
    c).Cookie
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            super.doGet(req, resp);
            
            // 新建一个Cookie
            Cookie cookie = new Cookie("name", "pwd");
            // 设置Cookie的生命周期
            cookie.setMaxAge(Integer.MAX_VALUE);
            // 将Cookie发送到客户端
            resp.addCookie(cookie);
            
            // Cookie的修改,创建一个和已有的cookie同名,然后再添加到客户端,自动修改
            Cookie secCookie = new Cookie("name", "newPwd");
             resp.addCookie(secCookie); // cookie修改
             
             // cookie的删除, 创建一个和已有的cookie同名,并设置maxAge为0,添加到客户端,就会自动删除
             Cookie thirCookie = new Cookie("name", "thirPwd");
             thirCookie.setMaxAge(0); // 修改生命周期为0
             resp.addCookie(thirCookie);  // 删除客户端cookie
        }
    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。 客户端浏览器会把Cookie保存起来,并由浏览器通过域名管理不同网站的Cookie。
     
    除了以上的Cookie属性之外,还写一些常用的属性,可以根据实际的需求设置。
    d).Session
    Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象。
      Session创建时间的误解:一般的误解是Session在客户端访问的时候就会被创建,但其实 Session 的真正创建时机是服务端程序调用 HttpServletRequest.getSession(true) . 我们知道JSP中有个内置对象是session,其实那是因为在我们编写的JSP代码中,默认有这么一句:HttpSession session = HttpServletRequest.getSession(true);在将JSP编译为Servlet代码的时候,Session就会被创建。但是Session会占用服务器的内存,因此我们不需要的时候,最好将该属性置false。  <% @page session=”false”%>。

      但客户端访问.html 等静态资源时,不涉及将JSP编译为Servlet,因此Session不会创建。当客户端第一次访问JSP页面时,服务器端将创建一个Session并保存在内存中,同时为客户端返回一个sessionID,以供客户端下次请求应用的时候带着sessionID来表明自己的身份。一次会话一个Session,Session通过sessionID来唯一标识。同时Session默认是在服务器的内存中维护的(虽然我们可以通过技术将session持久化),因此Session的长度不宜太大(虽然本身没有长度限制)。

      Session原理:因为http是无状态的连接,Session也不能根据连接来识别是否是同一次会话,因此客户端第一次请求JSP/Servlet之后,服务端会自动生成一个名叫JSESSIONID的Cookie,该Cookie的值就是sessionID,发送到客户端,客户端再次连接的时候,会自动带上这个JSESSIONID,找到相应的session。如果客户端端禁用了Cookie,那么这个JSESSIONID会通过URL重写发送到服务端。

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cache-Control: max-age=0
    Connection: keep-alive
    Cookie: JSESSIONID=819B75C412FB029EDEF52B11484A642B
    Host: localhost:8080
    Referer: http://localhost:8080/market/
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36


      

      Session的生命周期:

      它的生命周期不累加的,而Cookie的生命周期是累加的,不累加的意思就是Session的计时是从最近一次访问开始的,而Cookie是从开始到结束,无论你期间是否使用。

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            super.doGet(req, resp);
            
            // 真正的创建一个Session
            HttpSession session = req.getSession(true);
            // 设置Session的生命周期
            session.setMaxInactiveInterval(Integer.MAX_VALUE);
      }

      Session相关的属性:

    6. 讲讲Request对象的主要方法 

    序号  方法简述
    1 Cookie[] getCookies()
    返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
    2 HttpSession getSession(boolean create)
    返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
    3 Enumeration getParameterNames()
    返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
    4 Object getAttribute(String name)
    以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
    5 String getCharacterEncoding()
    返回请求主体中使用的字符编码的名称。
    6 String getMethod()
    返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
    7 String getParameter(String name)
    以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
    8 String getRemoteHost()
    返回发送请求的客户端的完全限定名称
    9 String getRemoteAddr()
    返回发送请求的客户端的互联网协议(IP)地址
    10 String getRemoteHost()
    返回发送请求的客户端的完全限定名称。

    7.过滤器有哪些作用和用法?

    过滤器的常见用途:

    a).对用户的请求进行统一的认证、对访问的请求进行记录和审核

    b).对用户传输的数据过滤和替换,转换图像格式,对响应内容进行压缩,减少网络传输

    c).对用户的请求和响应进行加密处理

    d).触发资源访问事件

    Filter工作流程:

     

     

     

     

     

     

     

     

     

     

     

     

    和 Filter相关的接口定义:

    // 编写一个Filter需要 实现这个接口
    public interface Filter {
        
        // 初始化Filter
        public default void init(FilterConfig filterConfig) throws ServletException {}
    
        // Filter的逻辑实现,如果有多个Filter,必须在末尾执行 chain.doFilter(req, resp);
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException;
    
        // 过滤器的销毁过程,可用于关闭该过滤器中打开的资源
        public default void destroy() {}
    }
    
    // 当有多个过滤器连成一串的时候,知道真正的请求资源之前的一系列过滤
    public interface FilterChain {
    
        public void doFilter(ServletRequest request, ServletResponse response)
                throws IOException, ServletException;
    
    }
    
    // 过滤器的配置相关
    // 做Filter初始化的时候,作为参数传入,初始化关于过滤器的配置
    public interface FilterConfig {
    
        public String getFilterName();
    
        public ServletContext getServletContext();
    
        public String getInitParameter(String name);
    
        public Enumeration<String> getInitParameterNames();
    
    }

    注意事项: Filter 的执行顺序是在 web.xml 中定义的顺序,在多个Filter中的chain 中,一定在处理完当前Filter的逻辑之后,调用chain.doFilter(request, response) 转到下一个Filter

     简单例子:

    /**
     * 实现字符编码过滤的过滤器
     * @author ytuan
     *
     */
    public class FilterTest implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
    
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
    
            req.setCharacterEncoding("UTF-8");
            resp.setCharacterEncoding("UTF-8");
    
            chain.doFilter(req, resp);
        }
    
    }

    8.请谈谈你对Javaweb开发中的监听器的理解?

    监听器示意图:

    JavaWeb中的监听器按照事件源分为三大类:作用范围由大而小

    a).ServletContext (针对整个应用程序上下文)

    b).HttpSession (针对单个用户会话)

    c).ServletRequest (针对某一次ServletRequest )

    针对这以上这三种不同作用域的对象,又把对象本身的事件类型分为三种:  

    a).域对象自身的创建和销毁事件监听

    b).域对象中属性的增删事件监听

    c).监听绑定到HttpSession域中某个对象的状态事件监听

    这里的对象创建和销毁包括三个,域对象中属性的增删包括ServletContext 和 ServletRequest 两个对象。需要重点注意一下HttpSession绑定的对象,它不同于前两者。

      保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object))到Session中;从 Session域中解除绑定(session.removeAttribute("bean"));随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复
      Servlet 规范中定义了两个特殊的监听器接口"HttpSessionBindingListenerHttpSessionActivationListener"来帮助JavaBean 对象了解自己在Session域中的这些状态: ,实现这两个接口的类不需要 web.xml 文件中进行注册

      a). HttpSessionBindingListener接口

        实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件
        当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法
        当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

      b).HttpSessionActivationListener接口

        实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件
        当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中.
        当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中  (此处参考:https://www.cnblogs.com/xdp-gacl/p/3969249.html

    9.说说web.xml文件中可以配置哪些内容?

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <!-- 配置web引用程序中Servlet上下文的初始化参数 -->
        <context-param>
            <param-name>name</param-name>
            <param-value>ytuan996</param-value>
        </context-param>
    
        <!-- 当程序中发生错误时,跳转到哪一个页面。这里的错误可以是异常,也可以是错误码,但是只能是其中之一 -->
        <error-page>
            <exception-type></exception-type>
            <error-code>500</error-code>
            <location>error.jsp</location>
        </error-page>
        <!-- 配置自己定义的过滤器 -->
        <filter>
            <!-- 还可以在这里定义过滤器的自定义参数 -->
            <init-param>
                <param-name></param-name>
                <param-value></param-value>
            </init-param>
            <filter-name></filter-name>
            <filter-class></filter-class>
        </filter>
    
        <!-- 过滤器的规则 -->
        <filter-mapping>
            <filter-name></filter-name>
            <url-pattern></url-pattern>
        </filter-mapping>
    
        <!-- 监听器 -->
        <listener>
            <listener-class></listener-class>
        </listener>
    
        <!-- 配置Servlet -->
        <servlet>
            <servlet-name></servlet-name>
            <servlet-class></servlet-class>
        </servlet>
    
        <!-- 配置Servlet的请求路径 -->
        <servlet-mapping>
            <servlet-name></servlet-name>
            <url-pattern></url-pattern>
        </servlet-mapping>
    
        <!-- 配置访问应用的欢迎页面,一般是首页面 -->
        <welcome-file-list>
            <welcome-file></welcome-file>
        </welcome-file-list>
    
    
    </web-app>

    10.请谈谈JSP有哪些内置对象?作用分别是什么?

     

    11.说一下表达式语言(EL)的隐式对象及其作用

     

    12.JSP中的静态包含和动态包含有什么区别?

      

     
     
     
     

      

  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/ytuan996/p/10588765.html
Copyright © 2011-2022 走看看